2012-02-07 1 views
6

Как и в названии, мне любопытно, есть ли способ настроить модуль ImageGrab.grab(), чтобы захватить, например, правый экран, а не левый в настройке с несколькими мониторами.Python PIL library - есть ли способ выбрать, какой экран ImageGrab.grab() захватывает в настройках с несколькими мониторами?

ответ

6

К сожалению, это невозможно из-за того, как PIL получает размеры дисплея. Когда он получает контекст устройства, он делает получить один для всех подключенных мониторов:

screen = CreateDC("DISPLAY", NULL, NULL, NULL); 

(display.c, строка 296, версия 1.1.7)

Однако, чтобы получить дисплей размеры, он использует этот код:

width = GetDeviceCaps(screen, HORZRES); 
height = GetDeviceCaps(screen, VERTRES); 

(display.c, строки 299-300, версия 1.1.7)

Который только возвращает размеры основного, активного монитора. Все последующие операции выполняются с этими значениями ширины и высоты, что приводит к окончательному изображению, которое является только размером основного дисплея.


Для получения Screengrab от всех подключенных мониторов, эти две линии должны быть заменены чем-то вроде:

width = GetSystemMetrics(SM_CXVIRTUALSCREEN); 
height = GetSystemMetrics(SM_CYVIRTUALSCREEN); 

После чего вам нужно перекомпилировать PIL. Это предоставит вам размеры виртуального экрана, который является «... ограничивающим прямоугольником всех мониторов дисплея». [MSDN]

Более правильное применение будет использовать для получения EnumDisplayMonitors контекстов устройств для отдельных мониторов, наряду с изменением ImageGrab.grab() 'ы интерфейса (или добавления новой функции), чтобы учесть при выборе конкретных монитор, контекст устройства которого будет использоваться для остальных операций.

+0

В вашей второй реализации я смог найти ручки для мониторов через enumDisplayMonitors .. но для следующего шага мне понадобится C, или это можно сделать в модуле ImageGrab? Если я буду следовать за вами правильно, функция, которую я должен создать, должна будет изменить вызов CreateDC («DISPLAY», NULL, NULL), заменив «DISPLAY» для дескриптора устройства. Я хочу делать снимки? – Zack

+0

Извините, что я не был чист, оба варианта требуют изменения исходного кода C для PIL и перекомпиляции. Вы правы, функция CreateDC - это то, что нужно изменить. – Andrew

Смежные вопросы