2012-02-07 11 views

Respuesta

6

Desafortunadamente no es posible, debido a la manera en que el PIL obtiene las dimensiones del dispositivo de visualización. Cuando se obtiene el contexto de dispositivo, se hace obtener una para todos los monitores conectados:

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

(display.c, línea 296, versión 1.1.7)

Sin embargo, para obtener la pantalla dimensiones, utiliza este código:

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

(display.c, líneas 299-300, versión 1.1.7)

que solo devuelve las dimensiones del monitor primario activo. Todas las operaciones posteriores se realizan con estos valores de ancho y alto, lo que da como resultado una imagen final que solo tiene el tamaño de la pantalla principal.


Con el fin de recibir una Screengrab de todos los monitores conectados, tendría que ser reemplazado con algo así como esas dos líneas:

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

Después de que había necesidad de recompilar PIL. Esto le proporcionará las dimensiones de la pantalla virtual, que es "... el rectángulo delimitador de todos los monitores de visualización". [MSDN]

Una implementación más correcta sería usando EnumDisplayMonitors obtener contextos de dispositivo para los monitores individuales, junto con la alteración ImageGrab.grab() 's interfaz (o la adición de una nueva función) para permitir la selección de una específica monitor, de cuyo dispositivo se usaría el contexto para las operaciones restantes.

+0

En su segunda implementación, pude encontrar los controladores para los monitores a través de enumDisplayMonitors ... pero para el siguiente paso, ¿necesitaría C, o puedo hacerlo en el módulo ImageGrab? Si te sigo correctamente, la función que tengo que crear necesitaría modificar la llamada a CreateDC ("DISPLAY", NULL, NULL), sustituyendo "DISPLAY" por el Device Handle del que quiero tomar instantáneas. – Zack

+0

Disculpe que no estaba claro, las dos opciones requieren modificar el código fuente C para PIL y volver a compilarlo. Estás en lo correcto, la función CreateDC es lo que necesita ser modificado. – Andrew

Cuestiones relacionadas