C# 如何确定运行.NET Windows窗体程序的监视器?

C# 如何确定运行.NET Windows窗体程序的监视器?,c#,.net,windows,winforms,screen,C#,.net,Windows,Winforms,Screen,我有一个C#Windows应用程序,我想确保如果用户将其移动到另一个监视器上,它会显示在第二个监视器上。我需要保存主窗体的大小、位置和窗口状态——我已经处理过了——但我还需要知道当用户关闭应用程序时它在哪个屏幕上 我使用Screen类来确定当前屏幕的大小,但是我找不到任何关于如何确定应用程序运行在哪个屏幕上的信息 编辑:谢谢大家的回复!我想确定窗口打开了哪个监视器,这样我就可以进行适当的边界检查,以防用户意外地将窗口放在查看区域之外,或者更改屏幕大小,使窗体不再完全可见。如果您记得窗口的位置和大

我有一个C#Windows应用程序,我想确保如果用户将其移动到另一个监视器上,它会显示在第二个监视器上。我需要保存主窗体的大小、位置和窗口状态——我已经处理过了——但我还需要知道当用户关闭应用程序时它在哪个屏幕上

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


编辑:谢谢大家的回复!我想确定窗口打开了哪个监视器,这样我就可以进行适当的边界检查,以防用户意外地将窗口放在查看区域之外,或者更改屏幕大小,使窗体不再完全可见。

如果您记得窗口的位置和大小,就足够了。当您将该位置设置为以前使用的位置时,如果它恰好位于第二个监视器上,它将返回该位置

例如,如果您有两个监视器,大小均为1280x1024,并且您将窗口的左侧位置设置为2000px,则它将显示在第二个监视器上(假设第二个监视器位于第一个监视器的右侧):)

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

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

只需输入窗口所需的位置,它就会告诉您是否可以在其中一个屏幕上看到它。享受吧

您可以使用“屏幕”对象: 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());
        }
Screen[] scr = Screen.AllScreens;
scr[i].Bounds.IntersectsWith(form.Bounds);
Screen[]screens=Screen.AllScreens;
for(int i=0;i

它可以为您提供所需的

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

Screen[] screens = Screen.AllScreens;
您还可以通过运行以下代码来确定您在哪个屏幕上(这是您所在的windows窗体)

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


,没有太多..我建议你自己在代码中乱搞。

你可以用

var s = Screen.FromControl(this);

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

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

否则,您可以执行以下操作:

        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());
        }
Screen[] scr = Screen.AllScreens;
scr[i].Bounds.IntersectsWith(form.Bounds);
每个屏幕都有一个Bounds属性,返回一个矩形。可以使用IntersectsWith()函数确定窗体是否在屏幕内

而且,它们基本上提供了一个函数,在Screen类上也可以实现这一点

Screen screen = Screen.FromControl(form);

同意,但在启动时进行一些检查会很好,这样在重新配置后,您的应用程序就不会在所有监视器之外。实际上,如果有人删除了第二个监视器,并且您的应用程序将尝试使用上一个会话中有两个监视器时的上/左监视器,Windows将自动将其移动到第一个监视器。所以实际上,您不需要调用isWindowVisible方法。我同意Henk的观点-检查我添加的示例,这样您就可以检查您的窗口是否可见对于使用.NET3.5或更高版本的用户来说,这只是一个LINQy版本:
returnscreen.AllScreens.Any(s=>s.Bounds.IntersectsWith(rect))