¿Cómo puedo tomar una captura de pantalla en una aplicación de Windows?

¿Cómo puedo tomar una captura de pantalla de la pantalla actual usando Win32?

// get the device context of the screen HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL); // and a device context to put it in HDC hMemoryDC = CreateCompatibleDC(hScreenDC); int width = GetDeviceCaps(hScreenDC, HORZRES); int height = GetDeviceCaps(hScreenDC, VERTRES); // maybe worth checking these are positive values HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, width, height); // get a new bitmap HBITMAP hOldBitmap = (HBITMAP) SelectObject(hMemoryDC, hBitmap); BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY); hBitmap = (HBITMAP) SelectObject(hMemoryDC, hOldBitmap); // clean up DeleteDC(hMemoryDC); DeleteDC(hScreenDC); // now your image is held in hBitmap. You can save it or do whatever with it 
 void GetScreenShot(void) { int x1, y1, x2, y2, w, h; // get screen dimensions x1 = GetSystemMetrics(SM_XVIRTUALSCREEN); y1 = GetSystemMetrics(SM_YVIRTUALSCREEN); x2 = GetSystemMetrics(SM_CXVIRTUALSCREEN); y2 = GetSystemMetrics(SM_CYVIRTUALSCREEN); w = x2 - x1; h = y2 - y1; // copy screen to bitmap HDC hScreen = GetDC(NULL); HDC hDC = CreateCompatibleDC(hScreen); HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, w, h); HGDIOBJ old_obj = SelectObject(hDC, hBitmap); BOOL bRet = BitBlt(hDC, 0, 0, w, h, hScreen, x1, y1, SRCCOPY); // save bitmap to clipboard OpenClipboard(NULL); EmptyClipboard(); SetClipboardData(CF_BITMAP, hBitmap); CloseClipboard(); // clean up SelectObject(hDC, old_obj); DeleteDC(hDC); ReleaseDC(NULL, hScreen); DeleteObject(hBitmap); } 
  1. Use GetDC(NULL); para obtener un DC para toda la pantalla.
  2. Use CreateCompatibleDC para obtener un DC compatible.
  3. Use CreateCompatibleBitmap para crear un bitmap para contener el resultado.
  4. Use SelectObject para seleccionar el bitmap en el DC compatible.
  5. Use BitBlt para copiar desde la pantalla DC al DC compatible.
  6. Deseleccione el bitmap del DC compatible.

Cuando crea el bitmap compatible, quiere que sea compatible con la pantalla DC, no con el DC compatible.

Hay una muestra de MSDN, Capturing an Image , para capturar un HWND arbitrario en un DC (podría intentar pasar el resultado de GetDesktopWindow a esto). Pero no sé qué tan bien funcionará esto con el nuevo compositor de escritorio en Vista / Windows 7.