Como posso tirar uma captura de canvas em um aplicativo do Windows?

Como posso tirar uma captura de canvas da canvas atual usando o 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 obter um DC para a canvas inteira.
  2. Use CreateCompatibleDC para obter um DC compatível.
  3. Use CreateCompatibleBitmap para criar um bitmap para manter o resultado.
  4. Use SelectObject para selecionar o bitmap no DC compatível.
  5. Use BitBlt para copiar da canvas DC para o DC compatível.
  6. Desmarque o bitmap do DC compatível.

Quando você cria o bitmap compatível, você quer que ele seja compatível com a canvas DC, não com o DC compatível.

Há um exemplo do MSDN, Capturando uma imagem , para capturar um HWND arbitrário em um controlador de domínio (você pode tentar passar a saída de GetDesktopWindow para isso). Mas quão bem isso funcionará sob o novo compositor de desktop no Vista / Windows 7, eu não sei.