1

我正在尝试编写一个程序来抓取当前活动窗口的屏幕截图,然后对结果进行一些基本的计算机视觉。我目前的代码如下:

RECT rc;
HWND hwnd = GetForegroundWindow();    //the window can't be min
if(hwnd == NULL) {
    cerr << "it can't find any 'note' window" << endl;
    system ("pause");
    return 0;
}
GetClientRect(hwnd, &rc);

//create
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, rc.right - rc.left, rc.bottom - rc.top);
SelectObject(hdc, hbmp);

//Print to memory hdc
PrintWindow(hwnd, hdc, PW_CLIENTONLY);

//Get the bitmap
BITMAP bm;
GetObject (hbmp, sizeof(bm), &bm);

//release
DeleteDC(hdc);
DeleteObject(hbmp);
ReleaseDC(NULL, hdcScreen);

在一切都说完之后,bm.bmBits 为 NULL。这特别奇怪,因为 bm 的所有其他字段都是正确的。显然,如果没有 bm.bmBits,我将无法做很多事情。谁能告诉我我做错了什么?

这段代码主要是从另一个问题的答案中复制的,但在那个代码句柄中,位图的句柄从未转移到 BITMAP 结构中,而是用于将位图添加到剪贴板。由于我想立即处理截图,我宁愿立即提取句柄内的数据并进行处理。

4

1 回答 1

0

bm.bmBits 为 NULL,因为您不拥有位图引用的内存。您需要让内核为您复制它们,使用GetDIBits等。

于 2013-10-20T04:00:29.547 回答