我开发记住用户的偏好,以表格的最后位于屏幕里的应用程序。在一些情况下,用户将具有它的二次屏幕上,并且再后来触发应用程序,而不会在第二屏幕(有时具有形式出现关闭屏幕)。其他时候,用户会改变他们的分辨率产生类似的效果。

我希望做的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函数将总是返回屏幕的数目,即使一个是关闭的。

检查屏幕分辨率您定位窗口前。这将让你弄清楚。如果你是要去的地方的决议的范围之外,你真正做到这一点了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top