Contexto: Estoy tratando de tomar una captura de pantalla de otra ventana para alimentarlo en OpenCV. Encontré un código en la web que debería poder convertir un BITMAP en algo con lo que OpenCV pueda trabajar. Lamentablemente me encontré con algunos problemas.¿Por qué GetObject devuelve un BITMAP con null bmBits?
Pregunta: ¿Por qué el atributo/miembro bmBits siempre es nulo? (I también intentado con PrintWindow en lugar de BitBlt el resultado fue el mismo)
#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;
}
¿Está tratando de hacer una captura de pantalla con este código, solo fuera de la mano? Lo parece. PrintWindow no es lo que necesita si ese es el caso. Todo lo que hace es enviar una WM_PRINT a la ventana de destino con un DC en el que volcar. No hay garantía de que la ventana procesará ese mensaje, y si es así, haga lo que quiera. Casi tiene todo lo que necesita, pero creo que necesita usar un BitBlt() para extraer bits de la pantalla DC a su DC compatible con su mapa de bits nuevo listo para recibirlos. – WhozCraig