从隐藏的 WebBrowser 控件(IWebBrowser2 接口 aka MSHTML)获取位图
Get bitmap from hidden WebBrowser control (IWebBrowser2 interface aka MSHTML )
我对 WebBrowser ActiveX 控件的呈现输出很感兴趣。该 WebBrowser 运行 正在处理中。这个想法是获得控件显示内容的"screenshot"。换句话说:获取 WebBrowser 像素。
目前最佳做法是什么?
因为经过一些小的研究,我发现至少有 5 种方法可以实现这一点:
IHTMLElementRenderer::DrawToDC
方法。
IViewObject2::Draw
路线。
OleDraw
路线。对我来说,这似乎只是方法 2 的简写。
PrintWindow
WindowsAPI函数。提供了正确的结果,但当带有 WebBrowser 控件的 Window 不可见时失败(WS_VISIBLE
样式缺失)
- 捕获桌面并裁剪到网络浏览器控件显示的区域
第一种方法看起来最有希望。但是,根据文档,是deprecated,所以我估计不能再依赖它了?
备注:
- 如果页面大于 window/viewport,那么丢失这些像素不是问题(我要捕获的页面是固定大小的)
- 我看过 IE 功能
FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI
,但这似乎只对需要 Windows 图元文件 (WMF) 输出的程序有影响。位图对我来说很好。
- 其他 windows 不应在最终结果中可见
- 当我第一次调用
DrawToDC
时,我得到了一个全黑的位图。后来发现这是因为我的位图是 1 位单色的。这显然是位图的默认值:我掉进了一个旧的 GDI 陷阱!
最终使用 Windows GDI 函数 BitBlt
从 window 中获取像素。
这可以正常工作,但如果它是主要应用程序 window.
,则希望在图像中也获得 window 边框 + 最小化和最大化框
解决方案是创建主要 window 的子 window,运行 浏览器 window 并从中获取像素 window 还有。
还发现从多个独立进程使用浏览器的 "render to a DC" 方法不会以线性方式扩展:启动的进程越多,每个进程 CPU 的使用率数字就会显着增加。
使用 BitBlt
方法不会发生这种情况。
在这两种情况下,当浏览器 运行 在主 window 中并且最小化时都会出现问题。在这种情况下,系统决定不需要绘制任何内容,生成的屏幕截图位图将保持为空。
我对 WebBrowser ActiveX 控件的呈现输出很感兴趣。该 WebBrowser 运行 正在处理中。这个想法是获得控件显示内容的"screenshot"。换句话说:获取 WebBrowser 像素。
目前最佳做法是什么?
因为经过一些小的研究,我发现至少有 5 种方法可以实现这一点:
IHTMLElementRenderer::DrawToDC
方法。IViewObject2::Draw
路线。OleDraw
路线。对我来说,这似乎只是方法 2 的简写。PrintWindow
WindowsAPI函数。提供了正确的结果,但当带有 WebBrowser 控件的 Window 不可见时失败(WS_VISIBLE
样式缺失)- 捕获桌面并裁剪到网络浏览器控件显示的区域
第一种方法看起来最有希望。但是,根据文档,是deprecated,所以我估计不能再依赖它了?
备注:
- 如果页面大于 window/viewport,那么丢失这些像素不是问题(我要捕获的页面是固定大小的)
- 我看过 IE 功能
FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI
,但这似乎只对需要 Windows 图元文件 (WMF) 输出的程序有影响。位图对我来说很好。 - 其他 windows 不应在最终结果中可见
- 当我第一次调用
DrawToDC
时,我得到了一个全黑的位图。后来发现这是因为我的位图是 1 位单色的。这显然是位图的默认值:我掉进了一个旧的 GDI 陷阱!
最终使用 Windows GDI 函数 BitBlt
从 window 中获取像素。
这可以正常工作,但如果它是主要应用程序 window.
解决方案是创建主要 window 的子 window,运行 浏览器 window 并从中获取像素 window 还有。
还发现从多个独立进程使用浏览器的 "render to a DC" 方法不会以线性方式扩展:启动的进程越多,每个进程 CPU 的使用率数字就会显着增加。
使用 BitBlt
方法不会发生这种情况。
在这两种情况下,当浏览器 运行 在主 window 中并且最小化时都会出现问题。在这种情况下,系统决定不需要绘制任何内容,生成的屏幕截图位图将保持为空。