コンテキスト:別のウィンドウのスクリーンショットを取ってOpenCVに送り込もうとしています。私はBITMAPをOpenCVと連携できるものに変換できるはずのWeb上にいくつかのコードを見つけました。残念ながら私はいくつかの問題に遭遇しました。なぜGetObjectはnullのbmBitsでBITMAPを返しますか?
質問:なぜbmBits属性/メンバーは常にnullですか? bmBits
部材は、DIBセクションの非ヌルである
#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は必要なものではありません。それは、ダンプするDCを持つWM_PRINTをターゲットウィンドウに送信することだけです。ウィンドウがそのメッセージを処理するという保証はありません。そうであれば、あなたが望むことをしてください。ほとんどの場合、必要なものはすべて用意されていますが、BitBlt()を使用して画面DCから互換DCにビットを引き込む必要があると思います。 – WhozCraig