簡體   English   中英

如何確定 Windows 應用程序是否在屏幕外?

[英]How to determine whether a Windows application is offscreen?

我正在嘗試為安裝了LogMeIn 的用戶調試一個奇怪的問題。 幾天后,我的應用程序打開的一些對話框可能會在屏幕外結束。 如果我能可靠地檢測到這一點,我可以以編程方式將對話框移回它們再次可見的位置。

注意:這必須適用於多個顯示器並使用 win32 API。 但是,如果您知道如何從 .NET 執行此操作,我可能可以從那里推斷...

更新:出於好奇,上面提到的錯誤與 wxWidgets 有關。 如果你運行一個 wxWidgets 應用程序,然后走開讓你的屏幕保護程序運行,然后使用 LogMeIn 遠程登錄,然后嘗試從你的應用程序打開一個對話框,如果你使用 wxDisplay::GetFromPoint(pos) 或 wxWindowBase,你會遇到問題::Center() 定位對話框。

只需將 MonitorFromWindow 與 MONITOR_DEFAULTTONULL 標志一起使用。 如果返回值為空,則您的窗口不可見。 您隨后可以傳遞 MONITOR_DEFAULTONEAREST 以能夠在最近的監視器上重新定位您的窗口。

1997 年 6 月 Microsoft Systems Journal 中有關多顯示器支持的所有基礎知識:

在多顯示器設置上定位對象:

在 .NET 中,您使用 Screen.PrimaryScreen.WorkingArea 結構來獲取主屏幕的邊界(我認為是其他顯示器的 Screen.Screens[x].WorkingArea),然后使用窗口的 Left 和 Top 屬性來獲取找出窗口的位置(如果它不在屏幕上,Top 和 Left 將大於 [Screen].Width 和 .Height。

在 .NET 中,我會在 Screen.AllScreen 中的每個屏幕上迭代,然后調用 screen.Bounds.Contains() 傳遞窗體的矩形,如果你想確保你的所有窗口都在 bounds(*) 內,或者調用 screen。 Bounds.IntersectsWith() 如果您只想確保表單的至少一部分可見。

(*) 不完全在一個屏幕范圍內並不意味着它不在總屏幕范圍內。 您還可以在每個屏幕邊界上調用 Rectangle.Union 來創建一個矩形來測試表單的矩形,但是您必須注意屏幕邊界的大小是否相同,因為環繞矩形也不是完全可見的。

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

無論您做什么,請考慮多台顯示器,這些顯示器的坐標可能在任何方向上與 (0,0) 相距數千像素。 我討厭當一個應用程序強迫自己回到另一個屏幕時,經常弄亂我當時可能正在玩的任何全屏游戲。

另請參閱如何獲取活動屏幕尺寸?

這是我在表單構造函數中使用的代碼,在您卸下筆記本電腦或您為使某些屏幕空間消失所做的任何事情后,可以快速將表單移動到可見屏幕。 細化供您自己消費。

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

看起來GetMonitorInfo()是 Danny 建議的 Win32 等效項。 我不確定您將如何為系統上的所有監視器獲取 HMONITOR,但看起來文檔中鏈接的示例有一些方法可以做到。

這是很久以前的事了,但 Marin Plante 的回答讓我得到了我需要的東西,所以我寫了一個簡單的擴展方法:

public static class WindowLocation
{
    public static Boolean VisibleOnScreen(this Form form)
    {
        foreach (Screen screen in Screen.AllScreens)
        {
            if (screen.Bounds.Contains(form.Bounds)) return true;
        }

        return false;
    }
}

可以幫助別人!

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

當然,我不知道這對多台顯示器是如何工作的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM