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

我正在尝试安装有LogMeIn的用户debugging一个奇怪的问题。 几天后,我的应用程序打开的一些对话框可能会离开屏幕。 如果我可以可靠地检测到,我可以编程方式将对话框移回到他们可见的地方。

注意:这必须适用于多个监视器,并使用win32 API。 但是,如果你知道如何从.NET做到这一点,我可以从那里推断出来…

更新:为了好奇,上面提到的bug与wxWidgets有关。 如果你运行一个wxWidgets应用程序,然后走开,让你的屏幕保护程序,然后用LogMeIn远程login,然后尝试从您的应用程序打开一个对话框,如果您使用wxDisplay :: GetFromPoint(pos)或wxWindowBase :: Center()来定位对话框。

只需使用带有MONITOR_DEFAULTTONULL标志的MonitorFromWindow即可。 如果返回值为null,则窗口不可见。 随后可以通过MONITOR_DEFAULTTONEAREST,以便能够在最近的显示器上重新定位窗口。

从1997年6月起支持多显示器支持的所有基础知识Microsoft Systems Journal:

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

在.NET中,使用Screen.PrimaryScreen.WorkingArea结构来获取主屏幕的界限(Screen.Screens [x] .WorkingArea for other monitors,我认为),然后使用窗口的Left和Top属性找出窗口的位置(如果不在屏幕上,则左上角将大于[屏幕]。宽度和高度。

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

(*)不完全在一个屏幕范围内并不意味着它不在整个屏幕范围内。 你也可以在每个屏幕边界上调用Rectangle.Union来创建一个矩形来测试你的表单的矩形,但是这时你必须注意屏幕边界的大小是否不一样,因为结构化的矩形也是不完全可见的。

这是更长的答案。 较短的一个是:我知道没有简单的方法。

无论你做什么,请考虑多个显示器,它们可能在任何方向上与(0,0)的距离有数千个像素的坐标。 我讨厌它,当一个应用程序强制自己回到另一个屏幕,经常搞乱我可能在当时的任何全屏幕游戏。

另请参见如何获取活动屏幕尺寸?

这是我在窗体构造函数中使用的代码,在您卸载笔记本电脑之后将窗体移动到可见的屏幕上,或者您为了使某些屏幕的房地产消失而做的更快。 提炼自己的消费。

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

它看起来像GetMonitorInfo()是Danny的建议的Win32等效。 我不知道如何为系统上的所有监视器获取HMONITOR,但看起来从文档链接的示例有一些方法可以实现。

嗯。 这可能没有帮助,但是当我做了VB,你可以做screen.width和screen.height,然后window.x和window.y …

当然,我不知道如何使用多个显示器。