2012-02-07 16 views

cevap

6

Ne yazık ki bu bağlı PIL gösterim cihazının boyutlarını elde ettiği şekilde etmek mümkün değildir.

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

(display.c, hat 296, sürüm 1.1.7) Bununla beraber

, görüntü elde etmek için: bu aygıt içerik aldığında, bu bağlı tüm monitör için bir elde etmek yapar

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

(display.c çizgileri 299-300, sürüm 1.1.7)

: boyutları, bu kodu kullanır Sadece primer, aktif monitör boyutlarını geri

. Sonraki tüm işlemler bu genişlik ve yükseklik değerleri ile yapılır ve sonuç olarak sadece birincil ekranın boyutu olan son bir görüntü elde edilir.

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

hangi sonra PIL yeniden derlemek gerekir: tüm ekli monitörlerin bir ScreenGrab alabilmek için


, bu iki satır gibi bir şey ile değiştirilmesi gerekir. Bu size sanal ekranın boyutlarını sağlar. Bu, "... tüm ekranların sınırlayıcı dikdörtgeni." [MSDN]

daha doğru bir uygulama, belirli bir seçimi için izin vermek için (yeni bir fonksiyon veya ekleme) ImageGrab.grab() 'nin bir arayüz değiştirilmesi ile birlikte, tek tek monitör için aygıt içeriklerini elde etmek EnumDisplayMonitors kullanılarak olacaktır Geri kalan işlemler için cihaz bağlamında hangi monitör kullanılacaktır. İkinci uygulamada

+0

, ben enumDisplayMonitors aracılığıyla monitörler için kolları bulabildim .. ama sonraki adım için, ben C gerekir, yoksa ImageGrab modülünde yapılabilir? Seni doğru takip ediyorum, ben oluşturmak zorunda fonksiyonu CreateDC ("DISPLAY", NULL, NULL) çağrısı, ben anlık görüntülerini almak isteyen Cihaz Kolu için 'DISPLAY' yerine değiştirmek gerekir? – Zack

+0

Üzgün ​​olmadığım için, her iki seçenek de PIL için C kaynak kodunu değiştirmeyi ve yeniden derlemeyi gerektirir. Haklısınız, CreateDC işlevi, değiştirilmesi gereken şey. – Andrew