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

时间:2018-02-21 14:53:58

标签: bitmap mshtml iwebbrowser2

我对WebBrowser ActiveX控件的渲染输出感兴趣。 WebBrowser正在进行中运行。我们的想法是获得一个"截图"控件显示的内容。换句话说:获取WebBrowser像素。

目前最佳做法目前是什么?

因为经过一些小规模的研究后我发现至少有5种方法可以达到这个目的:

  1. IHTMLElementRenderer::DrawToDC方法。
  2. IViewObject2::Draw路线。
  3. OleDraw路线。对我来说,这似乎是方法2的一个简短方法。
  4. PrintWindow Windows API函数。提供正确的结果,但是当带有WebBrowser控件的Window不可见时(WS_VISIBLE样式丢失)
  5. 捕获桌面并裁剪到web浏览器控件显示的区域
  6. 第一种方法看起来最有希望。但是,根据文档,它是deprecated,所以我想我不能再依赖它了?

    注意:

    • 如果页面大于窗口/视口,那么这些像素丢失不是问题(我想要捕获的页面是固定大小的)
    • 我已经看过IE功能FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI,但这似乎只对需要Windows图元文件(WMF)输出的程序有用。位图对我来说很好。
    • 最终结果中不应显示其他窗口
    • 当我第一次调用DrawToDC时,我最终得到了一个完全黑色的位图。事后证明这是因为我的位图是1位单色。这显然是位图的默认值:我陷入了旧的GDI陷阱!

1 个答案:

答案 0 :(得分:0)

最终使用Windows GDI功能BitBlt从窗口抓取像素。 这样做可以,但是如果它是主应用程序窗口,则还希望获得窗口边框+最小化和最大化图像中的框。

解决方案是在主窗口中创建一个子窗口,在该窗口中运行浏览器,并从该窗口中获取像素。

还发现,从多个隔离的进程使用浏览器的“渲染为DC”方法并不能以线性方式扩展:每个进程的CPU使用率数字随着启动的进程的增加而显着增加。 使用BitBlt方法不会发生这种情况。

在这两种情况下,当浏览器在主窗口中运行时都会出现问题,并且这种问题被最小化。在这种情况下,系统决定不需要绘制任何东西,并且结果屏幕快照位图将保持空白。