You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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实现,步骤如下:

  1. 调用GetDisplayConfigBufferSizes获取存储显示配置所需的缓冲区大小;
  2. 调用QueryDisplayConfig获取当前显示路径和目标设备的详细信息;
  3. 从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可能无法返回有效数据,但仍有两种可靠方式获取默认分辨率:

  1. 读取EDID信息:多数情况下,即使显示器禁用,显卡仍能读取其EDID数据,从中提取厂商预设的默认分辨率;若系统中存储过该显示器的EDID,也可从注册表路径HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAY下查找对应设备的EDID值解析。
  2. 通用兼容方案:如果无法读取EDID,可使用通用标准分辨率1024x768,这是几乎所有显示器都支持的VGA标准模式,能保证基础兼容性。

注:10年前关于获取推荐分辨率的遗留问题,在当前Windows 10及以上系统中,QueryDisplayConfigAPI已完全替代旧方法,能更稳定地获取包括推荐模式在内的所有显示配置信息。

内容的提问来源于stack exchange,提问作者Horst Walter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:42:35