2008-10-17 62 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); 
      } 
相关问题