2009-07-13 29 views
31

我有一個C#Windows應用程序,我想確保將顯示在第二個監視器上,如果用戶將其移動到一個。我需要保存主窗體的大小,位置和窗口狀態 - 我已經處理過 - 但我還需要知道用戶關閉應用程序時顯示的屏幕。如何確定我的.NET Windows Forms程序運行在哪個監視器上?

我正在使用Screen類來確定當前屏幕的大小,但我無法找到關於如何確定應用程序在哪個屏幕上運行的任何信息。

編輯:感謝您的回覆,每個人!我想確定窗口是在哪個監視器上,這樣我可以進行適當的邊界檢查,以防用戶意外地將窗口放在查看區域外面或更改屏幕大小,以致窗體不再可見。

+0

功能如果沒有類似的問題http://stackoverflow.com/questions/937298/restoring-window-size多位顯示器 – sgmoore 2009-07-13 19:44:23

回答

46

你可以得到一組你使用這段代碼的屏幕。

Screen[] screens = Screen.AllScreens; 

你也可以找出哪個屏幕上,通過運行此代碼(是Windows窗體你是)

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

總之退房Screen類和靜態幫手方法,他們可能會幫助你。

MSDN Link,沒有太多..我建議在自己的代碼中搞亂。

6

如果您還記得窗口的位置和大小,那就足夠了。當您將位置設置爲之前使用的位置時,如果碰巧位於第二臺顯示器上,它將返回到那裏。

例如,如果您有兩臺顯示器,兩臺顯示器的大小均爲1280x1024,並且將窗口的左側位置設置爲2000px,則它將出現在第二臺顯示器上(假設第二臺顯示器位於第一臺顯示器的右側)。

如果你擔心不是沒有當應用程序下次啓動時的第二個顯示器,你可以用這個方法來確定你的窗口相交任何屏幕:

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

只是傳遞中你的窗口的所需位置,它會告訴你它是否會在其中一個屏幕上可見。請享用!

+1

同意,但一些在啓動時檢查會很好,所以重新配置後,你的應用程序將不會在所有顯示器之外 – 2009-07-13 19:51:58

+0

實際上,如果有人刪除第二臺顯示器,你的應用程序將嘗試當有兩臺顯示器時,使用上一個會話的上/左,Windows會自動將其移動到第一個顯示器。所以實際上,你不需要調用isWindowVisible方法。 – SolutionYogi 2009-07-13 19:57:38

+0

我同意亨克 - 檢查我添加的示例,以便您可以檢查您的窗口是否可見。 :) – 2009-07-13 19:57:39

0

您可以使用 '屏幕' 對象: System.Windows.Forms.Screen

開始是這樣玩:

 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()); 
     } 

可能會得到你所需要的

4

您可以

var s = Screen.FromControl(this); 

其中this的形式(或窗體上的任何控件)獲得當前的屏幕。至於如何記住這有點棘手,但我會去在Screen.AllScreens數組中的索引,或者可能是s.DeviceName。無論哪種情況,請在啓動時使用設置前進行檢查,以防止使用斷開連接的監視器。

3

表單的位置會告訴你表單在哪個屏幕上。我不明白爲什麼你需要知道它在哪個屏幕上,因爲如果你使用你保存的位置恢復它,它應該恢復到同一位置(也許你可以擴展到原因)。

否則,你可以做這樣的事情:

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

每個屏幕都有它返回一個Rectangle一個Bounds屬性。您可以使用IntersectsWith()函數來確定表單是否在屏幕內。

而且,他們基本上提供,這是否也對Screen類

Screen screen = Screen.FromControl(form); 
相關問題