确定表单是否完全脱离屏幕

Cod*_*ody 37 c# screen winforms

我正在开发一个应用程序,它记住用户关于表单最后位于屏幕上的位置的首选项.在某些情况下,用户将其放在辅助屏幕上,然后在没有第二个屏幕的情况下稍后启动应用程序(有时窗体显示在屏幕外).其他时候,用户将改变其分辨率,从而产生类似的效果.

我希望在Form_Shown事件处理程序中执行此检查.基本上我想确定表格是否完全不在屏幕上,所以我可以重新定位它.

有什么建议?

And*_*ija 61

如果表格完全在屏幕上,请检查此功能:

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;
}
Run Code Online (Sandbox Code Playgroud)

如果它在屏幕上检查左上角:

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;
}
Run Code Online (Sandbox Code Playgroud)


小智 16

将上述所有解决方案与"IntersectsWith"方法和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));
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用[`Form.DesktopBounds`](http://msdn.microsoft.com/en-us/library/system.windows.forms.form.desktopbounds(v = vs.110).aspx) (2认同)

Cra*_*Tim 10

这里有完整的解决方案(基于所有答案).我添加了一个参数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;
}
Run Code Online (Sandbox Code Playgroud)

执行:

return IsOnScreen(this.Location, this.Size);
Run Code Online (Sandbox Code Playgroud)