如何在C#或C++中获取显示器默认/推荐显示模式?
获取显示器默认/推荐模式及禁用显示器的默认分辨率方案
你已经可以通过EnumDisplaySettingsA枚举所有显示器支持的模式,对应的C# P/Invoke声明如下:
public static extern int EnumDisplaySettingsA(string lpszDeviceName, int iModeNum, ref DEVMODEA lpDevMode);
针对你提出的核心问题,解决方案如下:
一、获取默认与推荐显示模式
1. 获取默认模式
- 若要获取当前生效的显示模式,调用
EnumDisplaySettingsA时传入iModeNum = -1(对应系统常量ENUM_CURRENT_SETTINGS),即可得到当前显示器正在使用的模式。 - 若要获取注册表中存储的默认模式(系统重启后会自动恢复的模式),传入
iModeNum = -2(对应ENUM_REGISTRY_SETTINGS)即可读取该配置。
2. 获取推荐显示模式
推荐模式是显示器厂商在EDID(扩展显示识别数据)中预设的最优分辨率,仅靠EnumDisplaySettingsA无法直接筛选,需通过Windows的QueryDisplayConfigAPI实现,步骤如下:
- 调用
GetDisplayConfigBufferSizes获取存储显示配置所需的缓冲区大小; - 调用
QueryDisplayConfig获取当前显示路径和目标设备的详细信息; - 从
DISPLAYCONFIG_TARGET_MODE结构中解析EDID数据,提取厂商指定的首选分辨率。
对应的C#核心代码示例:
// 简化的P/Invoke声明,完整实现需定义所有相关结构与常量 [DllImport("user32.dll")] public static extern long GetDisplayConfigBufferSizes(uint flags, out uint numPathArrayElements, out uint numModeInfoArrayElements); [DllImport("user32.dll")] public static extern long QueryDisplayConfig(uint flags, ref uint numPathArrayElements, IntPtr pathArray, ref uint numModeInfoArrayElements, IntPtr modeInfoArray, IntPtr currentTopologyId);
通过解析modeInfoArray中的DISPLAYCONFIG_VIDEO_SIGNAL_INFO结构,可提取EDID中的首选分辨率参数。
二、禁用显示器时获取可靠默认分辨率
当显示器处于禁用状态时,EnumDisplaySettingsA可能无法返回有效数据,但仍有两种可靠方式获取默认分辨率:
- 读取EDID信息:多数情况下,即使显示器禁用,显卡仍能读取其EDID数据,从中提取厂商预设的默认分辨率;若系统中存储过该显示器的EDID,也可从注册表路径
HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAY下查找对应设备的EDID值解析。 - 通用兼容方案:如果无法读取EDID,可使用通用标准分辨率
1024x768,这是几乎所有显示器都支持的VGA标准模式,能保证基础兼容性。
注:10年前关于获取推荐分辨率的遗留问题,在当前Windows 10及以上系统中,QueryDisplayConfigAPI已完全替代旧方法,能更稳定地获取包括推荐模式在内的所有显示配置信息。
内容的提问来源于stack exchange,提问作者Horst Walter
相关产品推荐
相关产品推荐

