我正在开发一个托管WebBrowser控件并保存网页截图的应用程序。 (C#,VS2008,IE 9,Vista。全部都是最新的.FEATURE_BROWSER_EMULATION设置为0x2328)
应用程序会获取网址列表并逐个导航到网址并保存屏幕截图。应用程序流简单如下:从文件中读取url,首先使用HttpWebRequest获取它,如果它存在并且如果它是html调用webBrowser.Navigate(url),则等待WebBrowser.ReadyState为WebBrowserReadyState.Complete(处理WebBrowser.DocumentCompleted事件并简单在ReadyState是WebBrowserReadyState.Complete之前什么都不做,等待几秒钟以保证安全(测试长达10秒),保存屏幕截图并移动到下一个URL。 它适用于几乎所有网址(来自许多不同网站的网页),但嵌入在我的应用程序中的WebBrowser不会呈现一些网址,尤其是来自www.securityfocus.com的网页,例如:http://www.securityfocus.com/bid/52023
我尝试禁用缓存,在每次请求之前清除缓存,等待最多10秒,只是为了给它一些时间来渲染等无济于事。我在视觉上确认WebBrowser不呈现页面,这不是与保存屏幕截图相关的问题(我使用的是BitBlt,但我不认为它是相关的)。该页面通常使用IE进行渲染。
如果您对此为何发生任何建议,请与我们联系。提前致谢
答案 0 :(得分:3)
我设法解决了这个问题! 事实证明,在最终的DocumentCompleted事件被触发后,webbrowser需要少量时间来实际呈现页面。通常我们没有注意到这种轻微的延迟,但是当你在一个循环之后运行循环(许多DocumentCompleted事件将在加载URL时触发)DocumentCompleted为页面时,webbrowser在你保存之前找不到渲染页面的时间screenshot.So你必须给它一些时间来呈现页面。
如果你天真地在UI线程上调用sleep来等待渲染,渲染也会休眠,并且在保存屏幕截图之前不会渲染页面。
所以你必须在另一个线程中等待,让UI线程空闲以留出时间来完成页面呈现,然后通过在主UI线程上调用Invoke方法从子线程返回到UI线程。