1

我需要实现一个屏幕捕获服务 (C++),它启动即导航到一个站点,然后抓取该站点。

我加载了站点并收到了 DISPID_FRAMENAVIGATECOMPLETE 事件,我正处于调用 IViewObject::Draw 的阶段,如下所示:

SHANDLE_PTR hwnd = 0;
browser->get_HWND(&hwnd);

RECT rc ={0,0,100, 100};
BOOL tst = GetClientRect((HWND)hwnd, &rc);

HDC hDC = GetDC((HWND)hwnd);
HDC hDCMem = CreateCompatibleDC(hDC);
HBITMAP hBitmap = CreateCompatibleBitmap(hDC, rc.right - rc.left, 
                                         rc.bottom - rc.top);
SelectObject(hDCMem, hBitmap);

//hr = OleDraw(ivo, DVASPECT_DOCPRINT, hdc, &rc);
hr = ivo->Draw(DVASPECT_CONTENT, -1, NULL, NULL, hDC, 
               hDCMem, (LPCRECTL)&rc, NULL, NULL, 0);

//copy to clipboard
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();

一切都返回正确的返回值,S_OK 等;

但是我在剪贴板上得到的只是一个黑色矩形 - 当复制到绘画中时,这可能是通过 CreatCompatibleBitmap 创建的普通位图数据。

如果我使用 PrintWindow 而不是 IViewObject::Draw 那么它可以工作,但是我不能使用它,因为它不适用于不可见的窗口(尽管目前在我的测试中一切都是可见的)。

有人知道代码有什么问题吗?

非常感谢。

4

1 回答 1

0

愚蠢的是,我忘记了一些 COM 基础知识。调用跨越进程边界。一旦我托管了控件(刚刚破解了一个使用 CHTMLView 的 MFC 应用程序),它就可以正常工作。

但是,我认为我应该有某种错误告诉这一点。

于 2013-04-15T16:22:33.223 回答