如何在Internet Explorer中获取网页渲染窗口的HWND?——浏览器助手对象

4
我正在使用Visual C++编写一个浏览器辅助对象(Browser Helper Object,BHO),需要对呈现的网页进行全屏截图。目前,我在我的BHO中捕获DocumentComplete事件。我获得了Browser的hWnd,并可以对其进行截图,但这不是我真正需要的。我真正需要的是页面呈现的窗口(而不是带有滚动条的框架)。
此外,我目前正在遇到竞争条件,即当我截取屏幕截图时,浏览器可能还没有呈现页面。我已经添加了UpdateWindow的调用,但即使它返回true,有时窗口仍未呈现。
综上所述:
1) 如何获取呈现的HTML窗口的hWnd 2) 适用于BHO的适当事件以进行屏幕截图?
编辑:
根据下面的答案,我创建了这段代码:
        MSHTML::IHTMLRectPtr pRect2 = pBody2->getBoundingClientRect();

        long width = pRect2->right;
        long height = pRect2->bottom;

        RECTL imageRect = { 0, 0, width, height };

        IViewObject *pViewObject = NULL;
        pHtmlDocument2->QueryInterface(IID_IViewObject, (void**)&pViewObject);

        HDC hdcScreen = GetDC(NULL);
        HDC hCompDc = CreateCompatibleDC(hdcScreen);

        pViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL, hCompDc, NULL, &imageRect, NULL, 0);

        HBITMAP hbmp = CreateCompatibleBitmap(hCompDc, imageRect.right - imageRect.left, imageRect.bottom - imageRect.top);
        SelectObject(hCompDc, hbmp);

        Bitmap *image = new Bitmap(hbmp, NULL);

        long bitLength = (imageRect.right - imageRect.left) * (imageRect.bottom - imageRect.top) * 4;
        byte *bits = (byte*)malloc(bitLength);
        memset(bits, 0, bitLength);

        BITMAPINFO *info = new BITMAPINFO();

        GetDIBits(hCompDc, hbmp, 0, imageRect.bottom - imageRect.top, bits, info, DIB_RGB_COLORS);

        FILE* file = fopen("d:\\screenshot.bmp", "wb");
        fwrite(bits, 1, bitLength, file);
        fclose(file);

很遗憾,输出不是有效的位图。我不知道我做错了什么,请帮忙。

1个回答

2

我假设您已经拥有了IWebBrowser2接口,是吗?

那么我将获取HTML文档的接口:

HRESULT IWebBrowser2::get_Document(IDispatch **ppDisp);

接着按照这里的建议,将内容绘制在提供的DC上:

//hCompDc is a CompatibleDC which select a CompatibleBitmap.
RECTL imageRect = {0, 0, nWidth, nHeight};
pHtmlDocument2->QueryInterface(IID_IViewObject, (void **)&pViewObject);
pViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL, 
                  hCompDc, NULL, &imageRect, NULL, 0);

非常感谢您的回答。hCompDc 的初始化是什么? - Payton Byrd
根据我链接的注释://hCompDc是一个CompatibleDC,它选择了一个CompatibleBitmap。 可以判断它是通过 CreateCompatibleDC() 创建的,然后使用 CreateCompatibleBitmap() 创建的位图被选入其中... - Vlad Feinstein
我认为您的问题在这里:HBITMAP hbmp = CreateCompatibleBitmap(hCompDc, ...;新创建的DC中选择了一个1x1的单色位图。您需要创建与屏幕DC兼容的位图。此外,您只是写下了一些位,这不是有效的位图格式。 - Vlad Feinstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接