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?
- Use
GetDC(NULL);
para obtener un DC para toda la pantalla. - Use
CreateCompatibleDC
para obtener un DC compatible. - Use
CreateCompatibleBitmap
para crear un mapa de bits para contener el resultado. - Use
SelectObject
para seleccionar el mapa de bits en el DC compatible. - Use
BitBlt
para copiar desde la pantalla DC al DC compatible. - 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);
}