¿Cómo puedo hacer una captura de pantalla de la pantalla actual usando Win32?¿Cómo puedo tomar una captura de pantalla en una aplicación de Windows?
Respuesta
// 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
Esto funciona en todas las ventanas basadas en nt de Windows NT4 a Windows 7. – Woody
¿Por qué está utilizando CreateDC y no solo GetDC (NULL)? – Anders
Honestamente, no lo he visto por un tiempo, este es un código bastante antiguo que he estado usando en una aplicación. ¡Funciona en todo, así que nunca volví a hacerlo! Si GetDC sería mejor, puedo enmendar la respuesta. – Woody
Hay una muestra de MSDN, Capturing an Image, para capturar un HWND arbitrario a un DC (puede 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.
- Utilice
GetDC(NULL);
para obtener un DC para toda la pantalla. - Utilice
CreateCompatibleDC
para obtener un DC compatible. - Utilice
CreateCompatibleBitmap
para crear un mapa de bits para contener el resultado. - Utilice
SelectObject
para seleccionar el mapa de bits en el DC compatible. - Utilice
BitBlt
para copiar de 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.
¿Qué pasa con los sistemas de pantalla doble? ¿Disparo de ambas pantallas? – i486
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. ¿Cómo tomar una captura de pantalla de una página web?
- 2. ¿Cómo puedo tomar una captura de pantalla y guardarla como JPEG en Windows?
- 3. Cómo tomar una captura de pantalla en OpenGL
- 4. ¿Cómo tomar una captura de pantalla con unidad HTML?
- 5. ¿Cómo puedo hacer una captura de pantalla en Windows PowerShell?
- 6. Cómo tomar una captura de pantalla con FireMonkey (multiplataformas)
- 7. ¿Cómo tomar la captura de pantalla programáticamente?
- 8. Sin iPhone, ¿cómo tomar una captura de pantalla con XCode?
- 9. ¿Cómo puedo tomar una captura de pantalla de un sitio web con .NET?
- 10. cómo tomar una captura de pantalla del iPhone programáticamente?
- 11. Tomar una captura de pantalla parcial en el iPad
- 12. Tomar una captura de pantalla con Pyglet [Fix'd]
- 13. Tomar una captura de pantalla de área específica
- 14. C#: cómo tomar una captura de pantalla de una parte de la pantalla
- 15. Tomar captura de pantalla de una página web (remota) programáticamente
- 16. ¿Hay alguna manera de tomar una captura de pantalla del escritorio de Windows del usuario?
- 17. La forma más rápida de tomar una captura de pantalla con Python en Windows
- 18. ¿Cómo puedo tomar una captura de pantalla/imagen de un sitio web usando Python?
- 19. Obtenga una captura de pantalla de una aplicación específica
- 20. Selenium 2 (webdriver): Tomar una captura de pantalla devuelve una imagen negra
- 21. ¿Cómo realizo programáticamente una captura de pantalla de una aplicación en Linux?
- 22. ¿Cómo tomar una captura de pantalla de la ventana activa en Delphi?
- 23. Captura de pantalla en Haskell?
- 24. cómo tomar una instantánea de la pantalla mediante programación?
- 25. Cómo tomar la captura de pantalla de una parte de Google Maps use JavaScript
- 26. Cómo tomar una captura de pantalla en Mac OS X usando Cocoa o C++
- 27. Código de JavaScript para tomar una captura de pantalla de un sitio web sin utilizar ActiveX
- 28. ¿Cómo tomar una captura de pantalla de iPhone de toda la vista, incluidas las partes fuera de la pantalla?
- 29. ¿Cómo tomar una captura de pantalla del área visible de UIScrollView?
- 30. Cómo tomar una captura de pantalla de la página HTML procesada
diversos métodos para la captura de la pantalla http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen – hB0
Aquí está mi GIST compilables: https://gist.github.com/rdp/9821698 – rogerdpack