2011-08-04 27 views
7

¿Cómo hacer una captura de pantalla con python, si está conectado a múltiples monitores?Captura de pantalla Python 2+ monitores (ventanas)

me trataron:

import sys 
from PyQt4.QtGui import QPixmap, QApplication 
app = QApplication(sys.argv) 
QPixmap.grabWindow(QApplication.desktop().winId()).save('test.png', 'png') 

import ImageGrab 
im = ImageGrab.grab() 
im.save('test.png', 'PNG') 

Ambas opciones proporcionan una captura de pantalla, sólo el monitor principal

Si uso winapi:

hWnd = win32gui.FindWindow(None, win_name) 
dc = win32gui.GetWindowDC(hWnd) 
i_colour = int(win32gui.GetPixel(dc,int(x),int(y))) 
rgb = ((i_colour & 0xff), ((i_colour >> 8) & 0xff), ((i_colour >> 16) & 0xff)) 

me sale una imagen de una ventana en el segundo monitor. Pero será muy lento.

Si presiono la tecla 'printscreen' en el portapapeles habrá una captura de pantalla normal, con todos los monitores. ¿Existe una opción para obtener una captura de pantalla completa en Python?

Respuesta

5

Usando una mezcla de wxPython, win32api y ctypes:

import wx, win32api, win32gui, win32con, ctypes 

class App(wx.App): 
    def OnInit(self): 
     dll = ctypes.WinDLL('gdi32.dll') 
     for idx, (hMon, hDC, (left, top, right, bottom)) in enumerate(win32api.EnumDisplayMonitors(None, None)): 
      hDeskDC = win32gui.CreateDC(win32api.GetMonitorInfo(hMon)['Device'], None, None) 
      bitmap = wx.EmptyBitmap(right - left, bottom - top) 
      hMemDC = wx.MemoryDC() 
      hMemDC.SelectObject(bitmap) 
      try: 
       dll.BitBlt(hMemDC.GetHDC(), 0, 0, right - left, bottom - top, int(hDeskDC), 0, 0, win32con.SRCCOPY) 
      finally: 
       hMemDC.SelectObject(wx.NullBitmap) 
      bitmap.SaveFile('screenshot_%02d.bmp' % idx, wx.BITMAP_TYPE_BMP) 
      win32gui.ReleaseDC(win32gui.GetDesktopWindow(), hDeskDC) 
     return False 

App(0) 
+0

¿Cómo no guardar el archivo, puede utilizar este mapa de bits en PIL? Image.open() – Echeg

7

Mi biblioteca Desktopmagic proporciona esta funcionalidad para Python 2.6, 2.7, y 3.3+. Puede devolver una imagen PIL/Pillow o escribir un BMP.