【问题标题】:How do I obtain the HWND of the Window that a web page is rendered on in Internet Explorer Browser Helper Objects如何在 Internet Explorer 浏览器帮助程序对象中获取呈现网页的窗口的 HWND
【发布时间】:2016-04-26 22:10:54
【问题描述】:

我正在用 Visual C++ 编写一个浏览器帮助对象,它需要对呈现的网页进行全长截图。目前,我正在 BHO 中捕获 DocumentComplete 事件。我得到了浏览器的 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);

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

【问题讨论】:

    标签: internet-explorer visual-c++


    【解决方案1】:

    我假设你有IWebBrowser2 接口,对吧?

    然后我会得到一个 HTML 文档的接口:

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

    然后到视图 (as suggested here),在提供的 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 是用什么初始化的?
    • 从我链接的评论来看://hCompDc is a CompatibleDC which select a CompatibleBitmap. 它是通过CreateCompatibleDC() 创建的,然后一个由CreateCompatibleBitmap() 创建的位图被选中...
    • 我相信你的问题在这里:HBITMAP hbmp = CreateCompatibleBitmap(hCompDc, ...;新创建的 DC 选择了一个 1x1 单色位图。您需要创建与屏幕 DC 兼容的位图。此外,您只是在写位,这不是有效的位图格式。
    猜你喜欢
    • 2013-07-11
    • 2019-11-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多