无法获取ViewObject :: Draw To Work

时间:2013-04-12 16:10:00

标签: windows winapi com

我需要实现一个屏幕捕获服务(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等;

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

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

任何想法都有错误吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

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

但是,我想我应该有一些错误告诉你。