C# 如何在现代多监视器系统上检测窗口是否可见

C# 如何在现代多监视器系统上检测窗口是否可见,c#,winforms,C#,Winforms,如何检测窗口是否对用户不可见,然后将其移动到可见的位置,以允许用户根据自己的喜好调整其大小 问题是:- 我有一个程序,保存的位置和形式的大小,这是完美的作品。 不幸的是,许多用户现在有多个屏幕图形卡,可以在复制和扩展之间切换 因此,如果用户关闭表单(程序保存在原来的位置),并且用户将其系统切换为“从复制扩展”,则会打开程序。 程序窗体现在不可见,因为它已超出当前屏幕系统的限制:( 用户可以看到它在任务栏上运行。但是,单击图标只会短暂闪烁最小化或最大化程序,右键单击只能选择关闭 我需要捕捉用户不可

如何检测窗口是否对用户不可见,然后将其移动到可见的位置,以允许用户根据自己的喜好调整其大小

问题是:- 我有一个程序,保存的位置和形式的大小,这是完美的作品。 不幸的是,许多用户现在有多个屏幕图形卡,可以在复制和扩展之间切换

因此,如果用户关闭表单(程序保存在原来的位置),并且用户将其系统切换为“从复制扩展”,则会打开程序。 程序窗体现在不可见,因为它已超出当前屏幕系统的限制:( 用户可以看到它在任务栏上运行。但是,单击图标只会短暂闪烁最小化或最大化程序,右键单击只能选择关闭

我需要捕捉用户不可见的区域,然后自动调整到任何活动窗口的大小。然后用户可以根据自己的需要调整大小/移动

我非常欢迎MSDN论坛上为同一个问题提供的任何想法/建议。本质上,这是对屏幕边界的快速检查,并检查程序是否在这些边界内。如果不在,则将其移动到
0,0

using System.Windows.Forms; 

class Form1 : Form {
    protected void EnsureVisible() {
        foreach (Screen scrn in Screen.AllScreens) {
        // You may prefer Intersects(), rather than Contains()
            if (scrn.Bounds.Contains(this.Bounds)) {
              return;
            }
        }
        this.Location = new Point( 0, 0 );
    }
} 
您可以使用该属性获取连接到计算机的所有屏幕的列表。使用该属性,您可以检查每个屏幕的边界框,并测试窗口是否位于所有屏幕之外。如果是,则重置位置


Jared Harley在我打字的时候抢先告诉了我。

你有保存窗口屏幕位置的自定义逻辑吗?你不想让操作系统来处理吗?@Jodrell,操作系统会记得从属于主应用程序窗口的窗口的位置吗?你有保存屏幕位置的自定义逻辑吗你的窗口?–Phil Gan。是的,我知道,这就是系统知道自己在哪里的方式。如果用户交换他/她的风格或扩展,那么一切都会出错duplicate@Jodrell,似乎他需要此功能是有原因的。尝试跳出框框思考。我将首先尝试此想法;因为它有示例代码:)请改用Screen.FromRectangle()。谢谢大家。我现在已经让程序使用Jared Harley提供的代码。