我正在用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] 删除。
我来说两句