winforms 确定窗体是否完全不在屏幕上

uqxowvwt  于 2023-08-07  发布在  其他
关注(0)|答案(8)|浏览(96)

我正在开发一个应用程序,它可以记住用户的首选项,比如表单最后在屏幕上的位置。在某些情况下,用户会在第二个屏幕上显示它,然后在没有第二个屏幕的情况下启动应用程序(有时会让表单显示在屏幕外)。其他时候,用户将改变他们的分辨率,导致类似的效果。
我希望在Form_Shown事件处理程序中执行此检查。基本上,我想确定窗体是否完全脱离屏幕,以便重新定位它。
有什么建议吗

fumotvh3

fumotvh31#

使用此函数检查Form是否完全显示在屏幕上

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;
}

tpxzln5u

tpxzln5u2#

将上述所有解决方案与“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));
}

字符串

lymnna71

lymnna713#

完整的解决方案(基于所有答案)。我添加了一个参数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);

kqlmhetl

kqlmhetl4#

旧的线程,但仍然有帮助!Cody和Andrija-感谢代码。我做了一些小的调整:represent. println();我使用formRectangle.Intersect(screen.WorkingArea);因为Intersect()用交集替换其对象。如果窗体完全不在屏幕上,则交集后的formRectangle为(0,0,0,0),Contains()返回true。因此,我还检查formRectangle Top、Left、Width和Height在返回true之前是否不全为0。现在,如果窗体的任何部分在屏幕上,则代码返回true,如果没有任何部分在屏幕上,则返回false。

bxpogfeg

bxpogfeg5#

对于WPF(基于Matthias 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));
}

字符串

qeeaahzv

qeeaahzv6#

如果显示器碰巧关闭,这些都不起作用。Screen.AllScreens函数将始终返回屏幕的数量,即使其中一个被关闭。

vi4fp9gy

vi4fp9gy7#

在定位窗口之前,请检查屏幕分辨率。这将允许您在实际执行之前,确定是否要将其放置在分辨率范围之外的位置。

ttvkxqim

ttvkxqim8#

使用DesktopBounds的一行程序解决方案:

Array.Exists(Screen.AllScreens, screen => screen.WorkingArea.Contains(DesktopBounds))

字符串

相关问题