Estoy usando Microsoft Visual Studio 2010 y Windows 7 Professional. Este es mi código para copiar la imagen de la ventana al portapapeles:
void PrintWindowEx( HWND hWnd ) { HDC hDCMem = CreateCompatibleDC(NULL); RECT rect; GetWindowRect(hWnd, &rect); HBITMAP hBmp = NULL; HDC hDC = GetDC(hWnd); hBmp = CreateCompatibleBitmap(hDC, rect.right - rect.left, rect.bottom - rect.top); HGDIOBJ hOld = SelectObject(hDCMem, hBmp); PrintWindow(hWnd, hDCMem, 0); SelectObject(hDCMem, hOld); DeleteObject(hDCMem); OpenClipboard(hWnd); EmptyClipboard(); SetClipboardData(CF_BITMAP, hBmp); CloseClipboard(); ReleaseDC(hWnd, hDC); } Funciona bien con todas las ventanas excepto la ventana principal de Google Chrome. Pensé que era porque Chrome usa la representación directa, así que deshabilité la aceleración de hardware en chrome://settings . Todavía no funciona. Luego me di cuenta de que trabajar con mensajes puede estar limitado debido a las restricciones en Chrome Sandbox, así que inicié Chrome con la opción de línea de comando --no-sandbox . Todavía no funciona.
¿Cómo puedo hacer que esto funcione? Para Chrome y cualquier otra ventana como Chrome. BitBlt() no es aceptable porque algunas partes de la ventana pueden estar superpuestas por otra ventana, la ventana puede estar en otro escritorio, etc. ¿Hay alguna solución que funcione? Tal vez con la carga de DLL en otro proceso o algo así.
UPD : se vuelve a dibujar después de RedrawWindow() ; para que pueda tomar una captura de pantalla (algunas partes: la parte izquierda (ancho ~ 20 px) y la parte derecha no se copian). Entonces, ¿es compatible con WM_PRINT o no? ¿Cómo puedo tomar una captura de pantalla completa de la ventana?
Estuve atascado durante mucho tiempo en esto, luego descubrí que puedo pasar un parámetro de PW_RENDERFULLCONTENT como último parámetro a PrintWindow. Buscar en Google que muestra que es nuevo en Windows 8.1, por lo que presumiblemente no funciona en 7. Sin embargo, puede valer la pena intentarlo, Winuser.h lo define como
#if(_WIN32_WINNT >= 0x0603) #define PW_RENDERFULLCONTENT 0x00000002 #endif /* _WIN32_WINNT >= 0x0603 */PrintWindow funciona enviando un WM_PRINT o WM_PRINTCLIENT a la ventana de destino. Mientras que DefWindowProc maneja WM_PRINT para clases de ventana estándar, las clases de ventana personalizadas deben manejar WM_PRINT para que PrintWindow produzca el resultado deseado. Si Chrome no maneja WM_PRINT o WM_PRINTCLIENT , no hay nada que puedas hacer.
Cuando se dirige a Windows Vista y superior, puede usar la API de miniaturas de DWM para obligar a una ventana a mostrar su contenido en una ventana de destino proporcionada por el cliente.