跟踪Windows窗体应用程序中的屏幕更改和屏幕分辨率更改以更改表单大小

我想根据屏幕及其分辨率更改表单大小。

我想要的是一个正确的事件来跟踪这些屏幕更改以及运行时的屏幕分辨率更改。

换一种说法,

  1. 如果用户使用两个屏幕并将应用程序移动到另一个屏幕,则应该跟踪并相应地更改大小,即如果新屏幕的分辨率较低则减小尺寸,或者如果分辨率较大则增大尺寸。

  2. 还可以在同一屏幕上跟踪屏幕分辨率更改,并相应地更改大小。

我知道如何更改表单大小,获取当前屏幕及其分辨率,只需要这些事件来跟踪这些更改。

回答这个问题,我决定改进它并添加更多信息以形成更完整的解决方案。

挑战

跟踪当前正在呈现表单的屏幕。 如果用户将表单拖动到另一台显示器或拔下显示器,则可能会发生这种情况。 如果用户手动将窗口拖动到不同的显示器或直接更改分辨率,则分辨率可能会更改。

首先,跟踪表单位置。 我们需要挂钩表单上下文的Move事件,幸运的是.Net框架提供了这样一个事件,它被命名为Control.Move Event 。

其次,我们需要挂钩屏幕分辨率更改事件,我们可以使用SystemEvents.DisplaySettingsChanged事件执行此操作 。

把它放在一起,我得到了这个:

struct Resolution { public int Width; public int Height; } int previous = -1; int current = -1; private bool CheckScreenChanged() { bool changed = false; current = GetScreenIndex(); if (current != -1 && previous != -1 && current != previous) // form changed screen. { changed = true; } previous = current; return changed; } private int GetScreenIndex() { return Array.IndexOf(Screen.AllScreens, Screen.FromControl(this)); } private Resolution GetCurrentResolution() { Screen screen = Screen.FromControl(this); Resolution res = new Resolution(); res.Width = screen.Bounds.Width; res.Height = screen.Bounds.Height; return res; } private void SetResolutionLabel() { Resolution res = GetCurrentResolution(); label2.Text = String.Format("Width: {0}, Height: {1}", res.Width, res.Height); } private void ScreenChanged() { label1.Text = "Screen " + current.ToString(); } private void Form_Moved(object sender, System.EventArgs e) { bool changed = CheckScreenChanged(); if (changed == true) { ScreenChanged(); SetResolutionLabel(); } } public void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e) { SetResolutionLabel(); } public void Initialize() { this.Move += Form_Moved; SystemEvents.DisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged); previous = GetScreenIndex(); current = GetScreenIndex(); ScreenChanged(); SetResolutionLabel(); } 

上面的代码在一个简单的表单上进行测试,该表单带有两个名为label1和label2的标签,当表单处于更改状态或分辨率发生变化时,这些标签会更新。

在我的主屏幕/显示器上执行此操作的图像

位于Screen0

当表单被拖动到我的辅助屏幕/显示器上时:

在此处输入图像描述