53

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

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

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

4

5 回答 5

69

您可以使用此代码获得一组屏幕。

Screen[] screens = Screen.AllScreens;

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

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

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

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

于 2009-07-13T19:48:31.327 回答
9

如果您记住窗口的位置和大小,就足够了。当您将位置设置为先前使用的位置时,如果它恰好在第二台显示器上,它将回到那里。

例如,如果您有 2 台显示器,尺寸均为 1280x1024,并且您将窗口的左侧位置设置为 2000 像素,它将出现在第二台显示器上(假设第二台显示器在第一台显示器的右侧。):)

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

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

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

于 2009-07-13T19:41:30.593 回答
7

您可以通过以下方式获取当前屏幕

var s = Screen.FromControl(this);

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

于 2009-07-13T19:49:09.593 回答
5

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

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

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

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

此外,它们基本上提供了一个在 Screen 类上也能做到这一点的函数

Screen screen = Screen.FromControl(form);
于 2009-07-13T19:56:37.270 回答
1

您可以使用“屏幕”对象: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());
        }

它可能会为您提供所需的东西

于 2009-07-13T19:48:16.677 回答