代码之家  ›  专栏  ›  技术社区  ›  kgriffs

如何确定Windows应用程序是否在屏幕外?

  •  5
  • kgriffs  · 技术社区  · 16 年前

    我正试图调试一个奇怪的问题,用户 LogMeIn 安装。几天后,我的应用程序打开的一些对话框可能会出现在屏幕外。如果我能够可靠地检测到这一点,我就可以通过编程将对话框移回它们再次可见的位置。

    注意:这必须适用于多个监视器并使用win32 API。然而,如果你知道如何从.NET做这件事,我可能可以从那里推断。。。

    更新:

    8 回复  |  直到 16 年前
        1
  •  9
  •   Frederik Slijkerman    16 年前

    只需将MonitorFromWindow与MONITOR\u DefaultToFull标志一起使用即可。如果返回值为null,则窗口不可见。随后,您可以传递MONITOR_DEFAULTTONEAREST,以便能够在最近的监视器上重新定位窗口。

        2
  •  2
  •   Michael Burr    16 年前

    1997年6月《Microsoft Systems Journal》中关于多监视器支持的所有基础知识:

    在多显示器设置上定位对象:

        3
  •  1
  •   TheSmurf    16 年前

    在.NET中,您可以使用Screen.PrimaryScreen.WorkingArea结构来获取主屏幕的边界(我认为Screen.Screens[x].WorkingArea用于其他监视器),然后使用窗口的Left和Top属性找出窗口的位置(如果它离开屏幕,则顶部和左侧将大于[Screen].Width和.Height)。

        4
  •  1
  •   Martin Plante    16 年前

    在.NET中,我将在Screen.AllScreen中的每个屏幕上迭代,然后调用Screen.Bounds.Contains()传递表单的矩形,如果您想确保所有窗口都在边界(*)内,或者调用Screen.Bounds.IntersectsWith(),如果您只想确保表单的至少一部分可见。

    这是一个较长的答案。较短的一条是:据我所知,没有简单的方法。

        5
  •  1
  •   tsilb    16 年前

    无论您做什么,请考虑多个监视器,这些监视器的坐标可能在任何方向上都与(0,0)相距数千像素。我讨厌一个应用程序强迫自己回到另一个屏幕上,经常把我当时可能在玩的任何全屏游戏弄得一团糟。

        6
  •  1
  •   Community CDub    8 年前

    另见 How can I get the active screen dimensions?

    这是我在表单构造器中使用的代码。在您卸下笔记本电脑或其他任何操作后,可以快速地将表单移动到可见屏幕上,从而消除一些屏幕不动产。为您自己的消费而精炼。

    if (!Screen.FromControl(this).Bounds.Contains(this.Location))
                {
                    this.DesktopLocation = new Point(100,100);
                }
    
        7
  •  0
  •   Andy    16 年前

    看起来像 GetMonitorInfo()

        8
  •  0
  •   Ben Thompson    4 年前

    这已经是很久以前的事了,但是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;
        }
    }
    

    我可以帮助别人!

        9
  •  -1
  •   mattl    16 年前

    嗯。这可能没有帮助,但当我使用VB时,你可以使用screen.width和screen.height,然后使用window.x和window.y。。。

    当然,我不知道如何在多个监视器上工作。