我对WebBrowser ActiveX控件的渲染输出感兴趣。 WebBrowser正在进行中运行。我们的想法是获得一个"截图"控件显示的内容。换句话说:获取WebBrowser像素。
目前最佳做法目前是什么?
因为经过一些小规模的研究后我发现至少有5种方法可以达到这个目的:
IHTMLElementRenderer::DrawToDC
方法。 IViewObject2::Draw
路线。OleDraw
路线。对我来说,这似乎是方法2的一个简短方法。PrintWindow
Windows API函数。提供正确的结果,但是当带有WebBrowser控件的Window不可见时(WS_VISIBLE
样式丢失)第一种方法看起来最有希望。但是,根据文档,它是deprecated,所以我想我不能再依赖它了?
注意:
FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI
,但这似乎只对需要Windows图元文件(WMF)输出的程序有用。位图对我来说很好。DrawToDC
时,我最终得到了一个完全黑色的位图。事后证明这是因为我的位图是1位单色。这显然是位图的默认值:我陷入了旧的GDI陷阱!答案 0 :(得分:0)
最终使用Windows GDI功能BitBlt
从窗口抓取像素。
这样做可以,但是如果它是主应用程序窗口,则还希望获得窗口边框+最小化和最大化图像中的框。
解决方案是在主窗口中创建一个子窗口,在该窗口中运行浏览器,并从该窗口中获取像素。
还发现,从多个隔离的进程使用浏览器的“渲染为DC”方法并不能以线性方式扩展:每个进程的CPU使用率数字随着启动的进程的增加而显着增加。
使用BitBlt
方法不会发生这种情况。
在这两种情况下,当浏览器在主窗口中运行时都会出现问题,并且这种问题被最小化。在这种情况下,系统决定不需要绘制任何东西,并且结果屏幕快照位图将保持空白。