从隐藏的 WebBrowser 控件(IWebBrowser2 接口 aka MSHTML)获取位图

Get bitmap from hidden WebBrowser control (IWebBrowser2 interface aka MSHTML )

我对 WebBrowser ActiveX 控件的呈现输出很感兴趣。该 WebBrowser 运行 正在处理中。这个想法是获得控件显示内容的"screenshot"。换句话说:获取 WebBrowser 像素。

目前最佳做法是什么?

因为经过一些小的研究,我发现至少有 5 种方法可以实现这一点:

  1. IHTMLElementRenderer::DrawToDC 方法。
  2. IViewObject2::Draw 路线。
  3. OleDraw 路线。对我来说,这似乎只是方法 2 的简写。
  4. PrintWindowWindowsAPI函数。提供了正确的结果,但当带有 WebBrowser 控件的 Window 不可见时失败(WS_VISIBLE 样式缺失)
  5. 捕获桌面并裁剪到网络浏览器控件显示的区域

第一种方法看起来最有希望。但是,根据文档,是deprecated,所以我估计不能再依赖它了?

备注:

最终使用 Windows GDI 函数 BitBlt 从 window 中获取像素。 这可以正常工作,但如果它是主要应用程序 window.

,则希望在图像中也获得 window 边框 + 最小化和最大化框

解决方案是创建主要 window 的子 window,运行 浏览器 window 并从中获取像素 window 还有。

还发现从多个独立进程使用浏览器的 "render to a DC" 方法不会以线性方式扩展:启动的进程越多,每个进程 CPU 的使用率数字就会显着增加。 使用 BitBlt 方法不会发生这种情况。

在这两种情况下,当浏览器 运行 在主 window 中并且最小化时都会出现问题。在这种情况下,系统决定不需要绘制任何内容,生成的屏幕截图位图将保持为空。