Kontext: Ich versuche, einen Screenshot von einem anderen Fenster zu machen, um es in OpenCV zu füttern. Ich habe Code im Internet gefunden, der in der Lage sein sollte, eine BITMAP in etwas zu konvertieren, mit dem OpenCV arbeiten kann. Leider geriet ich in Schwierigkeiten.Warum gibt GetObject eine BITMAP mit null bmBits zurück?
Frage: Warum ist das Attribut bmBits/member immer null? (I auch versucht, mit Printwindow anstelle von BitBlt war das Ergebnis das gleiche)
#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;
}
Versuchen Sie, einen Screenshot mit diesem Code zu erstellen, nur aus der Hand? Schaut so aus. PrintWindow ist nicht das, was Sie brauchen, wenn das der Fall ist. Es sendet lediglich ein WM_PRINT an das Zielfenster mit einem DC, auf dem ein Dump erfolgen soll. Es gibt keine Garantie, dass das Fenster diese Nachricht überhaupt verarbeitet, und wenn ja, tun Sie, was Sie wollen. Sie haben fast alles, was Sie brauchen, aber ich glaube, Sie müssen ein BitBlt() verwenden, um Bits von dem Bildschirm DC zu Ihrem kompatiblen DC mit Ihrer frischen Bitmap zu ziehen, bereit, sie zu empfangen. – WhozCraig