我正在尝试安装有LogMeIn的用户debugging一个奇怪的问题。 几天后,我的应用程序打开的一些对话框可能会离开屏幕。 如果我可以可靠地检测到,我可以编程方式将对话框移回到他们可见的地方。
注意:这必须适用于多个监视器,并使用win32 API。 但是,如果你知道如何从.NET做到这一点,我可以从那里推断出来…
更新:为了好奇,上面提到的bug与wxWidgets有关。 如果你运行一个wxWidgets应用程序,然后走开,让你的屏幕保护程序,然后用LogMeIn远程login,然后尝试从您的应用程序打开一个对话框,如果您使用wxdisplay :: GetFromPoint(pos)或wxWindowBase :: Center()来定位对话框。
我如何获得当前.exe的散列?
未处理的exception导致应用程序崩溃与“EventType clr20r3,P1 w3wp.exe”在日志中,但没有详细信息
.NET本地Windows商店版本
什么types的内存在32位Windows上有2 GB的限制?
从远程服务器读取证书哈希
SendKeys.send被阻止
什么版本的Windows将支持.NET 4.0?
单声道,asp.net c#和MVC如何和教程
SystemEvents.SessionSwitch用户被locking/解锁
只需使用带有MONITOR_DEFAULTTONULL标志的MonitorFromWindow即可。 如果返回值为null,则窗口不可见。 随后可以通过MONITOR_DEFAULTTONEAREST,以便能够在最近的显示器上重新定位窗口。
从1997年6月起支持多显示器支持的所有基础知识Microsoft Systems Journal:
http://www.microsoft.com/msj/0697/monitor/monitor.aspx
在多显示器上定位对象设置:
http://msdn.microsoft.com/en-us/library/ms534817(VS.85).aspx
在.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 …
当然,我不知道如何使用多个显示器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。