返回

如何在 .NET Windows Forms 程序中确定应用程序运行所在的显示器?

windows

在 .NET Windows Forms 程序中确定其运行所在的显示器

引言:

对于 .NET Windows Forms 应用程序来说,一个常见问题是确保用户将程序移动到另一个显示器后,程序仍会显示在该显示器上。本文将详细介绍如何确定应用程序运行所在的显示器,从而解决此问题。

确定所有可用显示器

第一步是获取所有可用显示器的列表。这可以通过 Screen.AllScreens 属性来实现。

Screen[] screens = Screen.AllScreens;

遍历显示器列表

获取显示器列表后,你需要遍历该列表,为每个显示器执行以下步骤:

  • 获取显示器的边界,即 Bounds 属性。
  • 将应用程序主窗体的边界(Bounds 属性)与显示器的边界进行比较。
foreach (Screen screen in screens)
{
    // 获取显示器的边界
    Rectangle screenBounds = screen.Bounds;
    
    // 获取主窗体的边界
    Rectangle formBounds = this.Bounds;
    
    // 比较边界
    if (screenBounds.Contains(formBounds))
    {
        // 主窗体位于此显示器上
    }
}

确定应用程序所在的显示器

通过比较主窗体的边界与每个显示器的边界,你可以确定应用程序运行所在的显示器。

foreach (Screen screen in screens)
{
    if (screen.Bounds.Contains(this.Bounds))
    {
        // 应用程序运行在此显示器上
        // 保存此显示器的索引或其他标识符
    }
}

代码示例

以下是一个代码示例,演示了如何获取应用程序运行所在的显示器:

using System.Drawing;
using System.Windows.Forms;

namespace DisplayMonitor
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 获取所有可用显示器
            Screen[] screens = Screen.AllScreens;

            // 遍历显示器列表
            foreach (Screen screen in screens)
            {
                // 确定应用程序所在的显示器
                if (screen.Bounds.Contains(this.Bounds))
                {
                    // 保存应用程序所在显示器的索引或其他标识符
                }
            }
        }
    }
}

结论

通过确定应用程序运行所在的显示器,你可以确保程序在任何显示器配置中都正常运行。这对于防止应用程序意外地置于视区外或因屏幕尺寸更改而无法完全可见至关重要。

常见问题解答

1. 如何获取显示器的索引?

可以通过 Screen.AllScreens 属性获取显示器的索引。

int index = screen.Index;

2. 如何保存显示器信息?

你可以将显示器的索引或其他标识符保存在应用程序设置、注册表或其他持久化存储中。

// 保存显示器索引
Properties.Settings.Default.DisplayIndex = index;

3. 如何在应用程序启动时将程序移动到正确的显示器?

在应用程序启动时,你可以读取先前保存的显示器信息并相应地移动窗口。

// 获取保存的显示器索引
int index = Properties.Settings.Default.DisplayIndex;

// 获取显示器
Screen screen = Screen.AllScreens[index];

// 移动窗口
this.Location = screen.Bounds.Location;

4. 如何处理多显示器设置?

在多显示器设置中,应用程序将显示在主显示器上。你可以通过检查 Screen.PrimaryScreen 属性来获取主显示器。

// 获取主显示器
Screen primaryScreen = Screen.PrimaryScreen;

// 如果应用程序不在主显示器上,移动它
if (primaryScreen.Bounds.Contains(this.Bounds))
{
    this.Location = primaryScreen.Bounds.Location;
}

5. 如何处理显示器旋转?

当显示器旋转时,显示器的 Bounds 属性会相应更新。这意味着你无需对应用程序进行任何更改即可处理旋转。