C#怎么获取多显示器屏幕尺寸_C#如何适应不同分辨率【解析】

张开发
2026/4/12 18:32:38 15 分钟阅读

分享文章

C#怎么获取多显示器屏幕尺寸_C#如何适应不同分辨率【解析】
Screen.AllScreens 可获取所有显示器的 Bounds含位置和宽高及 WorkingArea需配合 per-monitor V2 manifest 实现准确 DPI 感知否则 Bounds 返回逻辑像素而非物理分辨率。怎么用 Screen.AllScreens 拿到所有显示器的尺寸直接遍历 screen.allscreens 数组每个元素都带 bounds含位置和宽高和 workingarea排除任务栏后的可用区域。别只看主屏——screen.primaryscreen 只返回一个多屏场景下会漏掉其他显示器。常见错误是调用 Screen.FromControl(this) 或 Screen.FromPoint(Cursor.Position) 后只取单个结果误以为覆盖了全部屏幕。其实它们只是“就近查找”不是枚举。Bounds.Width 和 Bounds.Height 是物理像素尺寸受系统缩放影响比如 125% 缩放时1920×1080 屏幕可能返回 2400×1350如果要适配 DPI得配合 Graphics.DpiX/DpiY 或 WinForms 的 AutoScaleMode 使用不能光靠像素值做布局虚拟显示器如某些远程桌面、显卡驱动模拟的屏也会出现在 AllScreens 里需结合 IsPrimary 或设备名判断是否真实可用为什么 Screen.Bounds 和实际分辨率对不上因为 Windows 默认启用 DPI 缩放.NET Framework 4.7 的 WinForms 应用默认是“每显示器 DPI 感知”per-monitor DPI aware但旧项目或未声明 manifest 的程序会被系统用“DPI 虚拟化”处理——此时 Bounds 返回的是逻辑像素不是真实物理像素。典型现象在 4K 屏 150% 缩放下Bounds 显示为 2560×1440而真实分辨率是 3840×2160。这不是 bug是系统故意做的兼容层。查真实物理分辨率用 Graphics.CopyFromScreen() Bitmap 截图再读 Width/Height或调用 Win32 GetDeviceCaps(HORZRES/VERTRES)让应用真正高 DPI 感知必须在 app.manifest 里加 dpiAwarenessPerMonitorV2/dpiAwareness否则 Screen 类行为不可靠.NET Core/.NET 5 默认更严格没 manifest 就直接按 100% 处理容易在高缩放设备上显示过小WinForms 窗口跨屏拖动时怎么保持尺寸不变直接设置 Form.Size 不行——窗口跨屏瞬间系统可能触发自动缩放调整尤其从 100% 屏拖到 150% 屏时Size 值会被重算。关键在控制 Form.AutoScaleMode 和缩放时机。 Felvin AI无代码市场只需一个提示快速构建应用程序

更多文章