2008-10-17 126 views
5

我正在試圖安裝LogMeIn的用戶調試一個奇怪的問題。幾天之後,我的應用程序打開的一些對話框可能會離開屏幕。如果我可以可靠地檢測到,我可以通過編程將對話框移回到可以再次顯示的位置。如何確定Windows應用程序是否在屏幕外?

注意:這必須適用於多個顯示器並使用win32 API。然而,如果你知道如何從.NET中做到這一點,我可以從那裏推斷...

更新:爲了好奇,上面提到的bug與wxWidgets有關。如果您運行wxWidgets應用程序,然後離開並讓屏幕保護程序運行,然後使用LogMeIn遠程登錄,然後嘗試從應用程序打開一個對話框,如果使用wxDisplay :: GetFromPoint(pos)或wxWindowBase :: Center()來定位對話框。

+0

僅供參考:右鍵單擊任務欄中的屏幕外窗口,選擇移動,然後按箭頭鍵(它應該跳轉到鼠標)。然後使用鼠標或鍵完成移動。 – Aardvark 2008-10-17 19:43:29

+0

ALT + Space也可以。 – kgriffs 2008-10-17 19:45:04

回答

8

只需使用帶有MONITOR_DEFAULTTONULL標誌的MonitorFromWindow即可。如果返回值爲空,則窗口不可見。隨後可以傳遞MONITOR_DEFAULTTONEAREST以便能夠在最近的顯示器上重新定位窗口。

-1

嗯。這可能沒有幫助,但是當我做了VB,你可以做screen.width和screen.height,然後window.x和window.y ...

當然,我不知道它是如何工作的多個顯示器。

1

在.NET中,您使用Screen.PrimaryScreen.WorkingArea結構來獲取主屏幕的邊界(Screen.Screens [x] .WorkingArea for other monitors,我認爲),然後使用Left和Top屬性窗口的位置以查找窗口的位置(如果它離開屏幕,則左上角將大於[Screen] .Width和.Height。

1

在.NET中,我將在屏幕中的每個屏幕上進行迭代。 AllScreen,然後調用screen.Bounds.Contains()傳遞表單的矩形,如果你想確保你的所有窗口都在界限內(*),或者調用screen.Bounds.IntersectsWith()如果你只想確定在你的表格的至少一部分是可見的

(*)不完全在一個屏幕範圍內並不意味着它不在整個屏幕範圍內。您也可以在每個屏幕邊界上調用Rectangle.Union以創建一個矩形來測試您的表單的矩形,但是您必須注意屏幕邊界的大小是否不一樣,因爲結構化矩形也不完全可見。

這是較長的答案。較短的一個是:我知道沒有簡單的方法。

0

看起來像GetMonitorInfo()是Danny的建議的Win32等價物。我不知道如何爲系統上的所有監視器獲取HMONITOR,但看起來從文檔鏈接的示例有一些方法可以實現。

1

無論你做什麼,請考慮多個顯示器,這些顯示器可能在任何方向上與(0,0)之間的座標爲數千像素。我討厭它,當一個應用程序強制自己回到另一個屏幕,經常搞亂我可能在當時所有的全屏遊戲。

1

又見How can I get the active screen dimensions?

這是我的形式構造函數中使用它是一個匆匆的形式移動到可視屏幕您移除你的筆記本電腦後,或代碼不管它是你做,使一些屏幕房地產走遠。提煉自己的消費。

if (!Screen.FromControl(this).Bounds.Contains(this.Location)) 
      { 
       this.DesktopLocation = new Point(100,100); 
      } 
相關問題