C# 获取多个显示器信息、分辨率、缩放系数
在很多应用场景中,我们需要获取当前系统的显示器信息,特别是多显示器配置下的各个显示器的分辨率、缩放系数等。例如,在开发图形设计软件、游戏或需要全屏显示的应用时,了解显示器的物理和逻辑分辨率以及缩放系数至关重要。此外,在某些情况下,我们还需要判断多显示器配置是否有效,例如要求所有显示器的缩放系数必须一致。
本文将介绍如何使用 C# 通过 Windows API 来获取显示器的详细信息,计算缩放系数,并判断多显示器配置的有效性。
1. 准备工作
我们将使用以下 Windows API 函数:
EnumDisplayMonitors: 枚举所有显示器。GetMonitorInfo: 获取指定显示器的信息,包括设备名称和屏幕矩形。EnumDisplaySettings: 获取指定显示器的显示模式,包括物理分辨率。
同时,我们需要定义一些结构体来存储从 API 获取的数据。
2. 代码实现
以下是完整的 C# 代码,包括
DisplayInfo 类(用于存储显示器信息)、DisplayHelper 类(提供获取显示器信息和判断配置有效性的方法)以及 Program 类(主程序入口)。csharp
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace dpiTest
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("正在获取显示器信息...\n");
// 获取所有显示器信息
List<DisplayInfo> myDisplays = DisplayHelper.GetAllDisplaysInfo();
// 遍历并打印每个显示器的信息
foreach (var display in myDisplays)
{
Console.WriteLine($"==================== 显示器 {display.Index} ====================");
Console.WriteLine($"设备名称: {display.DeviceName}");
Console.WriteLine($"是否为主显示器: {display.IsPrimary}");
Console.WriteLine($"物理分辨率: {display.PhysicalWidth}x{display.PhysicalHeight}");
Console.WriteLine($"逻辑分辨率: {display.LogicalWidth}x{display.LogicalHeight}");
Console.WriteLine($"缩放系数 (X/Y): {display.ScaleX:F2} / {display.ScaleY:F2}");
Console.WriteLine($"缩放百分比 (X/Y): {display.ScalePercentageX:F0}% / {display.ScalePercentageY:F0}%");
Console.WriteLine("==============================================================");
Console.WriteLine();
}
// 判断显示配置是否有效
bool isConfigurationValid = DisplayHelper.IsDisplayConfigurationValid(myDisplays);
// 根据判断结果输出信息
if (isConfigurationValid)
{
Console.WriteLine("结论:当前显示配置有效,可以继续执行。");
// ... 在这里执行你的业务逻辑 ...
}
else
{
Console.WriteLine("结论:当前显示配置无效,请调整显示器缩放设置。");
}
Console.WriteLine("\n按任意键退出...");
Console.ReadKey();
}
/// <summary>
/// 显示器信息类,用于存储单个显示器的详细信息
///