2013-02-24 51 views
2

我正在承载WebBrowser控件并保存网页截图一个应用程序。 (C#,VS2008,IE 9,Vista。全部为最新版本,FEATURE_BROWSER_EMULATION设置为0x2328)WebBrowser控件不呈现一些网页

该应用程序会获取一个url列表并导航到url并逐一保存屏幕截图。申请流程很简单如下:从文件中读取URL,使用HttpWebRequest的获取首先,如果存在的话,如果它的HTML调用webBrowser.Navigate(URL),等到WebBrowser.ReadyState是WebBrowserReadyState.Complete(手柄WebBrowser.DocumentCompleted事件和简单在ReadyState为WebBrowserReadyState.Complete之前不做任何事情),等待几秒钟以保证安全(测试长达10秒),保存截图并移至下一个网址。 它可以正常工作,几乎所有的URL(从许多不同的网站页面),但web浏览器嵌入到我的应用程序不会呈现一些网址,尤其是网页从www.securityfocus.com例如:http://www.securityfocus.com/bid/52023

我试图禁用缓存,清理缓存在每个请求之前,等待长达10秒,只是给它一些时间渲染等无济于事。我直观地确认WebBrowser不会呈现页面,这不是与保存截图有关的问题(我使用BitBlt,但我认为它不相关)。该页面通常使用IE进行呈现。

请让我知道如果您有任何建议,为什么发生这种情况。在此先感谢

+0

该页面在IE中渲染得很好,WebBrowser是否足够扩展?也许尝试最大化窗口? – 2013-02-25 03:55:16

回答

3

我设法解决这个问题! 事实证明,在最终的DocumentCompleted事件触发后,webbrowser需要一点时间来实际渲染页面。通常我们不会注意到这种轻微的延迟,但是当你在最后一个循环之后运行一个循环时(许多DocumentCompleted事件将在加载url时被触发)DocumentCompleted用于页面,webbrowser在保存之前找不到页面的时间所以你必须给它一些时间来渲染页面。

如果你天真地调用UI线程睡眠来等待渲染,渲染也将入睡,你保存的截图之前的页面不会被渲染。

所以,你必须在另一个线程等待,离开UI线程空闲,以便有时间来完成页面渲染,然后通过调用Invoke方法在主UI线程上返回从子线程UI线程。

+0

+1我希望这也解决了我的渲染问题 - 听起来很有希望! – 2013-07-08 12:21:44