Python скриншот 2+ мониторов (windows) - PullRequest
7 голосов
/ 04 августа 2011

Как сделать скриншот с python, если подключен к нескольким мониторам?

Я пытался:

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

Обе опции предоставляют скриншот, только основной монитор

Если я использую 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))

Я получаю картинку из окна второго монитора. Но это будет очень медленно.

Если я нажму клавишу 'printscreen' в буфере обмена, будет обычный скриншот со всеми мониторами. Есть ли возможность получить полный скриншот в Python?

Ответы [ 2 ]

7 голосов
/ 02 июня 2013
Библиотека

My Desktopmagic предоставляет эту функцию для Python 2.6, 2.7 и 3.3+.Он может вернуть изображение PIL / Pillow или написать BMP.

5 голосов
/ 04 августа 2011

Используя смесь wxPython, win32api и 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)
...