【发布时间】:2012-10-01 16:31:37
【问题描述】:
上下文:我正在尝试截取另一个窗口的屏幕截图以将其输入 OpenCV。我在网上找到了一些代码,它们应该能够将 BITMAP 转换为 OpenCV 可以使用的东西。不幸的是,我遇到了一些麻烦。
问题:为什么 bmBits 属性/成员总是为空? (我也试过用 PrintWindow 而不是 BitBlt 结果是一样的)
#include <iostream>
#include <string>
#include <Windows.h>
int main(int argc, char* argv[])
{
std::wstring windowName = L"Calculator";
RECT rect;
HWND hwnd = FindWindow(NULL, windowName.c_str());
if (hwnd == NULL)
{
return 0;
}
GetClientRect(hwnd, &rect);
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen,
rect.right - rect.left, rect.bottom - rect.top);
SelectObject(hdc, hbmp);
PrintWindow(hwnd, hdc, PW_CLIENTONLY);
BITMAP bmp;
GetObject(hbmp, sizeof(BITMAP), &bmp);
return 0;
}
【问题讨论】:
-
你是不是想用这段代码截屏,只是副手?看起来像。如果是这样的话,PrintWindow 不是你所需要的。它所做的只是将 WM_PRINT 发送到目标窗口,并在其上转储 DC。无法保证 window 甚至会处理该消息,如果是,请执行您想要的操作。您几乎拥有所需的一切,但我相信您需要使用 BitBlt() 将位从屏幕 DC 拉到兼容的 DC,并准备好接收它们的新位图。