题
我开发记住用户的偏好,以表格的最后位于屏幕里的应用程序。在一些情况下,用户将具有它的二次屏幕上,并且再后来触发应用程序,而不会在第二屏幕(有时具有形式出现关闭屏幕)。其他时候,用户会改变他们的分辨率产生类似的效果。
我希望做的Form_Shown事件处理此检查。基本上我想确定表单是否是完全关闭屏幕,所以我可以重新定位它。
任何意见?
解决方案
检查与如果表格是的完全在屏幕上该功能强>:
public bool IsOnScreen( Form form )
{
Screen[] screens = Screen.AllScreens;
foreach( Screen screen in screens )
{
Rectangle formRectangle = new Rectangle( form.Left, form.Top,
form.Width, form.Height );
if( screen.WorkingArea.Contains( formRectangle ) )
{
return true;
}
}
return false;
}
检查的仅左上方的点的如果它是在屏幕上:
public bool IsOnScreen( Form form )
{
Screen[] screens = Screen.AllScreens;
foreach( Screen screen in screens )
{
Point formTopLeft = new Point( form.Left, form.Top );
if( screen.WorkingArea.Contains( formTopLeft ) )
{
return true;
}
}
return false;
}
其他提示
以上结合使用“IntersectsWith” -method和LINQ的扩展所有的解决方案使我们在短:
public bool IsOnScreen(Form form)
{
// Create rectangle
Rectangle formRectangle = new Rectangle(form.Left, form.Top, form.Width, form.Height);
// Test
return Screen.AllScreens.Any(s => s.WorkingArea.IntersectsWith(formRectangle));
}
这里完整的解决方案(基于所有答案)。我添加了一个参数MinPercentOnScreen
其中像素至少有此%必须在所有屏幕/显示器是可见的。因此,如果这个收益false
你将需要移动窗口位置恢复为默认。
// Return True if a certain percent of a rectangle is shown across the total screen area of all monitors, otherwise return False.
public bool IsOnScreen(System.Drawing.Point RecLocation, System.Drawing.Size RecSize, double MinPercentOnScreen = 0.2)
{
double PixelsVisible = 0;
System.Drawing.Rectangle Rec = new System.Drawing.Rectangle(RecLocation, RecSize);
foreach (Screen Scrn in Screen.AllScreens)
{
System.Drawing.Rectangle r = System.Drawing.Rectangle.Intersect(Rec, Scrn.WorkingArea);
// intersect rectangle with screen
if (r.Width != 0 & r.Height != 0)
{
PixelsVisible += (r.Width * r.Height);
// tally visible pixels
}
}
return PixelsVisible >= (Rec.Width * Rec.Height) * MinPercentOnScreen;
}
实现:
return IsOnScreen(this.Location, this.Size);
旧线,但还是有帮助的! Cody和Andrija-感谢代码。我不得不作出几个小的调整: 代替screen.WorkingArea.Intersect(formRectangle);我用formRectangle.Intersect(screen.WorkingArea);自相交()与所述交点代替它的对象。如果窗体完全关闭屏幕,formRectangle交点后是(0,0,0,0),和包含()返回真。所以,我也检查,看看是否formRectangle上,左,宽度和高度都不尽0返回true之前。现在,如果窗体的任何部分是在屏幕上,和假如果没有部分在屏幕上的代码返回true。
有关的 WPF 强>(基于马蒂亚斯Loerkes回答)
...添加到 System.Windows.Forms的和 System.Drawing中
的参考//using System.Windows.Forms;
public bool IsOnScreen(Window window)
{
var windowRect = new System.Drawing.Rectangle((int)window.Left, (int)window.Top, (int)window.Width, (int)window.Height);
return Screen.AllScreens.Any(s => s.WorkingArea.IntersectsWith(windowRect));
}
这些工作的无如果监视器恰好是关闭。该Screen.AllScreens函数将总是返回屏幕的数目,即使一个是关闭的。
检查屏幕分辨率您定位窗口前。这将让你弄清楚。如果你是要去的地方的决议的范围之外,你真正做到这一点了。