2011-08-04 39 views
7

Cách tạo ảnh chụp màn hình với python, nếu được kết nối với nhiều màn hình?Ảnh chụp màn hình của Python 2+ (cửa sổ)

tôi đã cố gắng:

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

Cả hai tùy chọn cung cấp một ảnh chụp màn hình, chỉ có màn hình chính

Nếu tôi sử dụng 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)) 

tôi nhận được một bức tranh từ một cửa sổ trong lần thứ hai màn hình. Nhưng nó sẽ rất chậm.

Nếu tôi bấm phím 'màn hình in' trong khay nhớ tạm sẽ là ảnh chụp màn hình bình thường, với tất cả màn hình. Có một tùy chọn để có được một ảnh chụp màn hình đầy đủ trong Python?

Trả lời

5

Sử dụng một kết hợp của wxPython, win32api và 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

Làm thế nào để lưu tệp, bạn có thể sử dụng bitmap này trong PIL? Image.open() – Echeg

7

thư viện Desktopmagic tôi cung cấp chức năng này cho Python 2.6, 2.7, và 3.3+. Nó có thể trả về một hình ảnh PIL/Pillow hoặc viết một BMP.

Các vấn đề liên quan