如何获取Internet Explorer浏览器帮助器对象中呈现网页的窗口的HWND

佩顿·伯德

我正在用Visual C ++编写一个浏览器帮助器对象,该对象需要对呈现的网页进行完整的屏幕截图。当前,我正在BHO中捕获DocumentComplete事件。我得到了浏览器的hWnd,并且可以对其进行截图,但这并不是我真正需要的。我确实需要呈现页面的Window(而不是带有滚动条的框架)。

另外,我目前正在遇到一种竞争状况,当我截取屏幕截图时,浏览器可能尚未渲染页面。我已经添加了一个调用,UpdateWindow但是即使返回true,有时仍未呈现该窗口。

因此,总结一下:

1)如何获取渲染的HTML窗口的水平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);

不幸的是,输出不是有效的位图。我不知道我在做什么错。请帮忙。

弗拉德·费恩斯坦

我假设您有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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JavaScript如何在Internet Explorer 8和Internet Explorer 9(浏览器端)中获取文件大小?

如何在Internet Explorer中监视浏览器事件?

如何获取TextField以在DRF的API浏览器中呈现?

获取屏幕,当前网页和浏览器窗口的大小

如何在javascript中获取浏览器窗口大小?

从浏览器中的对象获取数据

在Internet Explorer BHO中添加浏览器操作按钮

jQuery平滑滚动浏览器不在Internet Explorer中

在Internet Explorer浏览器中运行Oracle Forms

从Internet Explorer启动Chrome浏览器

如何为Internet Explorer浏览器修复JavaScript中的数组indexOf()

WinRT:无论默认浏览器如何,都可以在Internet Explorer中打开链接

如何使用 html 或任何浏览器语言在 Internet Explorer 中打开链接?

如何抽象出浏览器窗口对象的用法?

如何更改默认网页以在浏览器中打开

如何在Chrome浏览器中更正网页的字体?

如何在网页中居中浏览器屏幕?

获取浏览器呈现的html + javascript

如何在Docusaurus中呈现浏览器

如何在浏览器中呈现CSS / HTML?

如何使用ExpressJS在浏览器中呈现JSON

如何使用React在浏览器中呈现应用预览

如何在 Electron 14 的渲染器中获取当前浏览器窗口

如何在单个图像中从浏览器获取整个网页的屏幕截图

如何在全新的浏览器中启动窗口?

如何在谷歌浏览器中删除额外的窗口

重复线性渐变在Edge浏览器和Internet Explorer浏览器中不起作用

如何识别网页是在iframe中加载还是直接加载到浏览器窗口中?

如何在网页浏览器中定向网页以建立呼叫对话框?