2

我正在开发一个托管 WebBrowser 控件并保存网页屏幕截图的应用程序。(C#、VS2008、IE 9、Vista。所有都是最新的。FEATURE_BROWSER_EMULATION 设置为 0x2328)

该应用程序获取 url 列表并逐个导航到 url 并保存屏幕截图。应用程序流程简单如下:从文件中读取 url,首先使用 HttpWebRequest 获取它,如果它存在并且如果它是 html 调用 webBrowser.Navigate(url),等到 WebBrowser.ReadyState 为 WebBrowserReadyState.Complete (处理 WebBrowser.DocumentCompleted 事件并简单在 ReadyState 为 WebBrowserReadyState.Complete 之前什么都不做),再等几秒钟以确保安全(最多测试 10 秒),保存屏幕截图并移至下一个 url。它适用于几乎所有 url(来自许多不同站点的页面),但嵌入在我的应用程序中的 WebBrowser 不会呈现某些 url,尤其是来自 www.securityfocus.com 的页面,例如:http ://www.securityfocus.com/bid/ 52023

我尝试禁用缓存,在每次请求之前清除缓存,等待最多 10 秒,只是为了给它一些时间来渲染等无济于事。我在视觉上确认 WebBrowser 没有呈现页面,这不是与保存屏幕截图相关的问题(我正在使用 BitBlt,但我认为它不相关)。页面使用 IE 正常呈现。

如果您对为什么会发生这种情况有任何建议,请告诉我。提前致谢

4

1 回答 1

3

我设法解决了这个问题!事实证明,在触发最终 DocumentCompleted 事件后,webbrowser 需要少量时间来实际呈现页面。通常我们不会注意到这种轻微的延迟,但是当您在最后一个(加载 url 时将触发许多 DocumentCompleted 事件)页面的 DocumentCompleted 之后立即运行循环时,webbrowser 在保存之前无法找到时间来呈现页面screenshot.So 你必须给它一些时间来呈现页面。

如果你天真地在 UI 线程上调用 sleep 来等待渲染,那么在你保存截图之前,渲染也会休眠,页面不会被渲染。

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

于 2013-02-27T21:50:49.660 回答