我正在尝试编写一个程序来抓取当前活动窗口的屏幕截图,然后对结果进行一些基本的计算机视觉。我目前的代码如下:
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 结构中,而是用于将位图添加到剪贴板。由于我想立即处理截图,我宁愿立即提取句柄内的数据并进行处理。