2009-07-13 9 views
31

Kullanıcı bire taşıyorsa ikinci bir monitörde görüneceğinden emin olmak istediğim bir C# Windows uygulaması var. Ana formun boyutunu, konumunu ve pencere durumunu kaydetmem gerekiyordu - ki bu da zaten ele aldım - ancak kullanıcı uygulamayı kapattığında hangi ekranın açık olduğunu da bilmem gerekiyor..NET Windows Forms programımın hangi monitörde çalıştığını nasıl belirlerim?

Geçerli ekranın boyutunu belirlemek için Ekran sınıfını kullanıyorum ancak uygulamanın hangi ekran üzerinde çalıştığını belirleyemiyorum.

Düzenleme: Yanıtlar için teşekkürler, herkes! Pencerenin hangi monitörde olduğunu belirlemek istedim, böylece kullanıcının pencereyi yanlışlıkla görüntüleme alanı dışında bırakması veya ekran boyutunu değiştirmesi için formun tamamen görünür olmayacağı şekilde uygun sınırları kontrol edebiliyordum.

+0

bunu yapar bir işlev sağlarsanız http://stackoverflow.com/questions/937298/restoring-window-size bu değil benzer soru -posta-ile-çoklu monitörler – sgmoore

cevap

46

Bu kodu kullandığınız bir dizi Ekran alabilirsiniz.

Screen[] screens = Screen.AllScreens; 

Ayrıca kısa check out Ekran sınıf ve statik içinde

Screen screen = Screen.FromControl(this); //this is the Form class 

(bu pencereleri üzerinde meydana olduğunu ) bu kodu çalıştırarak, hangi İlerlediğiniz ekranı anlayabiliriz yardımcı yöntemler, size yardımcı olabilirler.

MSDN Link, fazla bir şey yok .. Kodu kendiniz karıştırmayı öneriyorum.

+0

Evet, insanlar bu Form'un Control'ten miras kaldığını unutuyor gibi görünüyor. Bu yüzden Screen.FromControl üzerinde çalışacaktır. – Powerlord

+4

Belki de bunu yeniden belirtmeliyim ... Form, Control'den devralınan ScrollableControl'den gelen ContainerControl öğesinden miras alır. – Powerlord

+0

Bu tamamen yanlış – Janie

6

Pencerenin konumunu ve boyutunu hatırlarsanız, bu yeterli olacaktır. Konumu daha önce kullanılan konuma ayarladığınızda, eğer ikinci monitörde olsaydı, oraya geri döner.

Örneğin, iki monitörünüz varsa, her ikisi de 1280x1024 boyutundadır ve pencerenizin sol konumunu 2000 piksel olarak ayarladığınızda, ikinci monitörde görüntülenir (ikinci monitörün ilkinin sağında olduğu varsayılarak). :) Sadece geçmek

private bool isWindowVisible(Rectangle rect) 
{ 
    foreach (Screen screen in Screen.AllScreens) 
    { 
     if (screen.Bounds.IntersectsWith(rect)) 
      return true; 
    } 
    return false; 
} 

: Eğer uygulama bir dahaki sefere başladığında orada olmak değil ikinci monitör hakkında endişe duyuyorsanız

, kendi pencere ekranlarının herhangi kesişiyor olmadığını belirlemek için bu yöntemi kullanabilirsiniz Pencerenizin istediğiniz konumu ve ekranlardan birinde görünüp görünmeyeceğini size söyleyecektir. Keyfini çıkarın! System.Windows.Forms.Screen

Başlat böyle bir şey ile oynarken:

+1

kabul, ama başlangıçta bazı kontrol güzel olurdu, böylece bir yeniden yapılandırma sonra senin app tüm monitörler dışında olmayacak –

+0

Aslında, birisi ikinci monitörü kaldırırsa ve uygulamanız İki monitör olduğunda önceki oturumdan Üst/Sol tuşlarını kullanın, Windows otomatik olarak ilk monitöre taşıyacaktır. Yani pratik olarak, isWindowVisible yöntemini çağırmanız gerekmez. – SolutionYogi

+0

Henk'e katılıyorum - eklediğim örneği kontrol ederek pencerenizin görünüp görünmeyeceğini kontrol edebilirsiniz. :) –

0

Sen 'Ekran' nesnesini kullanabilirsiniz

 Screen[] screens = Screen.AllScreens; 
     for (int i = 0; i < screens.Length ; i++) 
     { 
      Debug.Print(screens[i].Bounds.ToString()); 
      Debug.Print(screens[i].DeviceName); 
      Debug.Print(screens[i].WorkingArea.ToString()); 
     } 

O may ihtiyacın olanı almak

4

Sen this Formunu (veya Form üzerinde herhangi bir kontrol) 'dir

var s = Screen.FromControl(this); 

ile cari Ekran alabilirsiniz. Bunu hatırlamak için biraz zor, ama ben Screen.AllScreens dizisi, ya da belki de s.DeviceName dizin için gider. Her iki durumda da, bağlantısı kesilmiş bir monitörün kullanılmasını önlemek için başlangıçta ayarları kullanmadan önce kontrol edin.

+1

DeviceName için gitmedim, DeviceName her zaman değişebilir, yeni bir ekran kartı veya monitör aldığınız zaman söyleyin ... –

+0

Onları Vista'da \\. \ DISPLAY1 ve \\. \ DISPLAY2 olarak alıyorum. Ama XP için farklı olabilir, emin değilim. –

+0

Katılıyorum, kimse gerçekten emin değil .. bu yüzden kullanamayacağım. :) –

3

Formun konumu, formun hangi ekranda olduğunu size söyleyecektir. Gerçekten neden ekranda olduğunu bilmeniz gerekmediğini anlamıyorum, çünkü kaydettiğiniz konumu kullanarak geri yüklerseniz, aynı konuma geri dönmeniz gerekir (belki de neden olabileceğinize göre genişletebilirsiniz).

Screen[] scr = Screen.AllScreens; 
scr[i].Bounds.IntersectsWith(form.Bounds); 

Her ekran Dikdörtgen döndüren bir Sınırlar özelliği vardır:

Aksi halde böyle bir şey yapabilirsiniz. Formun ekran içinde olup olmadığını belirlemek için IntersectsWith() işlevini kullanabilirsiniz.

Ayrıca, temelde Ekran sınıfına yanı

Screen screen = Screen.FromControl(form);