2011-08-04 19 views
7

Jak zrobić zrzut ekranu z pythonem, jeśli jest podłączony do wielu monitorów?Zrzut ekranu Pythona 2+ monitorów (Windows)

Próbowałem:

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') 

Obie opcje zapewniają zrzut ekranu, tylko monitor główny

Jeśli używam 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)) 

uzyskać obraz z okna na sekundę monitor. Ale będzie bardzo powolny.

Jeśli naciśnie klawisz "printscreen" w schowku będzie zwykły zrzut ekranu, ze wszystkimi monitorami. Czy istnieje opcja uzyskania pełnego ekranu w Pythonie?

Odpowiedz

5

Korzystanie mieszankę wxPython, Win32API i 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

Jak nie zapisać pliku, możesz użyć tej mapy bitowej w PIL? Image.open() – Echeg

7

Moja Desktopmagic biblioteka udostępnia tę funkcję dla Pythona 2.6, 2.7 i 3.3+. Może zwrócić obraz PIL/Pillow lub napisać BMP.