tomar pantalla pant laptop impr hacer cómo computadora como capturar captura c++ winapi screenshot

c++ - laptop - ¿Cómo puedo tomar una captura de pantalla en una aplicación de Windows?



como tomar captura de pantalla en laptop (4)

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


  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 mapa de bits para contener el resultado.
  4. Use SelectObject para seleccionar el mapa de bits en el DC compatible.
  5. Use BitBlt para copiar desde la pantalla DC al DC compatible.
  6. Deseleccione el mapa de bits del DC compatible.

Cuando crea el mapa de bits 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.


// 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); }