使用下面的代码找出一个 Point (例如最后已知的窗口位置)是否在整个桌面的范围内。如果没有,重置窗口的位置到默认的 PBaseLoc;
代码没有考虑到任务栏或其他工具栏,你自己在那里。
示例使用: 将 Window 位置从 A 站保存到数据库。用户登录到 B 站与2个监视器和移动窗口到第二个监视器,登出保存新的位置。返回到 A 站,除非使用上面的代码,否则窗口将不会显示。
我进一步的解决方案是将用户 ID 和工作站的 IP (& winLoc)保存到数据库或者给定应用的本地用户首选项文件中,然后加载该工作站和应用的用户首选项。
Point pBaseLoc = new Point(40, 40)
int x = -500, y = 140;
Point pLoc = new Point(x, y);
bool bIsInsideBounds = false;
foreach (Screen s in Screen.AllScreens)
{
bIsInsideBounds = s.Bounds.Contains(pLoc);
if (bIsInsideBounds) { break; }
}//foreach (Screen s in Screen.AllScreens)
if (!bIsInsideBounds) { pLoc = pBaseLoc; }
this.Location = pLoc;
此方法通过使用 Left 和 Top 的最低值以及 Right 和 Bottom 的最高值返回包含所有屏幕边界的矩形..。
static Rectangle GetDesktopBounds() {
var l = int.MaxValue;
var t = int.MaxValue;
var r = int.MinValue;
var b = int.MinValue;
foreach(var screen in Screen.AllScreens) {
if(screen.Bounds.Left < l) l = screen.Bounds.Left ;
if(screen.Bounds.Top < t) t = screen.Bounds.Top ;
if(screen.Bounds.Right > r) r = screen.Bounds.Right ;
if(screen.Bounds.Bottom > b) b = screen.Bounds.Bottom;
}
return Rectangle.FromLTRB(l, t, r, b);
}
var screenX = PInvoke.User32.GetSystemMetrics(PInvoke.User32.SystemMetric.SM_CXSCREEN);
var screenY = PInvoke.User32.GetSystemMetrics(PInvoke.User32.SystemMetric.SM_CYSCREEN);