如何确定运行.NET Windows Forms程序的监视器?

时间:2009-07-13 19:34:42

标签: c# .net windows winforms screen

我有一个C#Windows应用程序,如果用户将其移动到第二台显示器,我希望它能够显示在第二台显示器上。我需要保存主窗体的大小,位置和窗口状态 - 我已经处理过了 - 但是当用户关闭应用程序时,我还需要知道它所在的屏幕。

我正在使用Screen类来确定当前屏幕的大小,但我找不到任何关于如何确定应用程序运行的屏幕的信息。

编辑:感谢您的回复,大家好!我想确定窗口所在的监视器,以便我可以进行适当的边界检查,以防用户意外地将窗口放在查看区域之外或更改屏幕大小,使得窗体不再完全可见。

5 个答案:

答案 0 :(得分:54)

您可以使用此代码获取一系列屏幕。

Screen[] screens = Screen.AllScreens;

您还可以通过运行此代码来确定您所在的屏幕(是您所使用的Windows窗体)

Screen screen = Screen.FromControl(this); //this is the Form class

简而言之,请查看Screen类和静态帮助器方法,它们可能会对您有所帮助。

MSDN Link,没有多少......我建议你自己搞乱代码。

答案 1 :(得分:7)

如果你还记得窗户的位置和大小,那就足够了。当您将位置设置为先前使用的位置时,如果它恰好位于第二个监视器上,它将返回到那里。

例如,如果您有2个显示器,两个都是1280x1024,并且您将窗口的左侧位置设置为2000px,它将出现在第二个显示器上(假设第二个显示器位于第一个显示器的右侧。):)< / p>

如果您担心下次启动应用程序时第二台显示器不在那里,您可以使用此方法确定您的窗口是否与任何屏幕相交:

private bool isWindowVisible(Rectangle rect)
{
    foreach (Screen screen in Screen.AllScreens)
    {
        if (screen.Bounds.IntersectsWith(rect))
            return true;
    }
    return false;
}

只需传入窗口所需的位置,它就会告诉您它是否会在其中一个屏幕上显示。享受!

答案 2 :(得分:5)

您可以使用

获取当前的屏幕
var s = Screen.FromControl(this);

其中this是表单(或表单上的任何控件)。至于如何记住这有点棘手,但我会选择Screen.AllScreens数组中的索引,或者s.DeviceName。在任何一种情况下,请在启动时使用设置之前进行检查,以防止使用已断开连接的显示器。

答案 3 :(得分:4)

表单的位置将告诉您表单所在的屏幕。我真的不明白为什么你需要知道它在哪个屏幕上,因为如果你使用你保存的位置恢复它,它应该只恢复到相同的位置(也许你可以扩展为什么)。

否则你可以这样做:

Screen[] scr = Screen.AllScreens;
scr[i].Bounds.IntersectsWith(form.Bounds);

每个屏幕都有一个返回Rectangle的Bounds属性。您可以使用IntersectsWith()函数来确定表单是否在屏幕内。

此外,它们基本上提供了一个在Screen类

上执行此操作的功能
Screen screen = Screen.FromControl(form);

答案 4 :(得分:1)

您可以使用'Screen'对象: System.Windows.Forms.Screen

开始玩这样的事情:

        Screen[] screens = Screen.AllScreens;
        for (int i = 0; i < screens.Length ; i++)
        {
            Debug.Print(screens[i].Bounds.ToString());
            Debug.Print(screens[i].DeviceName);
            Debug.Print(screens[i].WorkingArea.ToString());
        }

它可以为您提供所需的信息