如何通过API获取Windows显示器HDR能力及切换HDR状态(求C#示例)
获取并切换Windows显示器HDR状态的C#实现
Win32_DesktopMonitor属于旧版WMI类,不包含HDR这类现代显示特性数据,以下是基于官方推荐API的实现方案:
一、获取HDR能力信息
方案1:使用Windows Runtime现代API(推荐,支持Windows 10 1809+)
适用于.NET 5+或.NET Core 3.1+项目,直接调用Windows.Graphics.Display.Core命名空间的API:
using System; using Windows.Graphics.Display.Core; public static class HdrInfoHelper { public static void GetDisplayHdrCapabilities() { foreach (var adapter in DisplayManager.GetCurrentAdapters()) { foreach (var target in adapter.GetCurrentTargets()) { var advancedColorInfo = target.GetAdvancedColorInfo(); Console.WriteLine($"显示器ID: {target.Id}"); Console.WriteLine($"支持「使用HDR」: {advancedColorInfo.IsHdrSupported}"); Console.WriteLine($"支持「播放流式HDR视频」: {advancedColorInfo.IsStreamingHdrSupported}"); Console.WriteLine($"当前HDR状态: {advancedColorInfo.CurrentAdvancedColorKind}"); Console.WriteLine("---"); } } } }
字段说明:
IsHdrSupported:对应系统设置中「使用HDR」的支持状态IsStreamingHdrSupported:对应「播放流式HDR视频」的支持状态CurrentAdvancedColorKind:返回当前高级颜色模式,AdvancedColorKind.Hdr表示已开启HDR
方案2:P/Invoke调用原生DisplayConfig API(兼容.NET Framework)
如果项目基于.NET Framework,可通过调用Windows原生API获取信息:
using System; using System.Runtime.InteropServices; public enum DISPLAYCONFIG_DEVICE_INFO_TYPE { DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO = 10 } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_ADVANCED_COLOR_INFO { public uint size; public uint flags; public uint colorSpace; public uint minLuminance; public uint maxLuminance; public uint maxFullFrameLuminance; } [StructLayout(LayoutKind.Sequential)] public struct DISPLAYCONFIG_TARGET_DEVICE_NAME { public uint size; public DISPLAYCONFIG_DEVICE_INFO_TYPE type; public LUID adapterId; public uint id; public uint outputTechnology; public uint edidManufactureId; public uint edidProductCodeId; public ushort connectorInstance; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public string monitorFriendlyDeviceName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string monitorDevicePath; } [StructLayout(LayoutKind.Sequential)] public struct LUID { public uint LowPart; public int HighPart; } public static class HdrPInvokeHelper { [DllImport("User32.dll", SetLastError = true)] private static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName); [DllImport("User32.dll", SetLastError = true)] private static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_ADVANCED_COLOR_INFO advancedColorInfo); public static void GetHdrCapabilitiesViaPInvoke() { // 示例:需先通过DisplayConfigGetDevices获取所有显示适配器和目标ID,这里简化处理 var targetName = new DISPLAYCONFIG_TARGET_DEVICE_NAME(); targetName.size = (uint)Marshal.SizeOf(targetName); targetName.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO; // 实际使用时需填充adapterId和id,可通过DisplayConfigGetDevices获取 // targetName.adapterId = ...; // targetName.id = ...; var colorInfo = new DISPLAYCONFIG_ADVANCED_COLOR_INFO(); colorInfo.size = (uint)Marshal.SizeOf(colorInfo); // 转换指针调用API IntPtr ptr = Marshal.AllocHGlobal((int)colorInfo.size); Marshal.StructureToPtr(targetName, ptr, false); int result = DisplayConfigGetDeviceInfo(ref colorInfo); Marshal.FreeHGlobal(ptr); if (result == 0) { bool isHdrSupported = (colorInfo.flags & 0x1) != 0; bool isStreamingHdrSupported = (colorInfo.flags & 0x2) != 0; bool isHdrEnabled = (colorInfo.flags & 0x4) != 0; Console.WriteLine($"支持「使用HDR」: {isHdrSupported}"); Console.WriteLine($"支持「播放流式HDR视频」: {isStreamingHdrSupported}"); Console.WriteLine($"当前HDR启用状态: {isHdrEnabled}"); } else { Console.WriteLine($"获取失败,错误码: {Marshal.GetLastWin32Error()}"); } } }
二、切换HDR状态
使用Windows.Graphics.Display.DisplayEnhancementOverride类(支持Windows 10 1903+),示例代码:
using System; using Windows.Graphics.Display; using Windows.Foundation; public static class HdrToggleHelper { private static DisplayEnhancementOverride _enhancementOverride; public static async void ToggleHdr(bool enable) { _enhancementOverride ??= DisplayEnhancementOverride.GetForCurrentView(); var result = await _enhancementOverride.TrySetOverrideAsync( new DisplayEnhancementOverrideSettings { AdvancedColorOverride = enable ? AdvancedColorOverrideKind.ForceOn : AdvancedColorOverrideKind.ForceOff }); Console.WriteLine(result == DisplayEnhancementOverrideResult.Success ? (enable ? "HDR已成功开启" : "HDR已成功关闭") : $"切换失败,错误码: {result}"); } }
注意事项:
- 切换操作需要应用具备对应权限,桌面应用建议以管理员身份运行
- 若要恢复系统默认设置,传入
AdvancedColorOverrideKind.System即可 - 项目需配置Windows SDK版本,例如在项目文件中添加:
<PropertyGroup> <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework> <UseWindowsForms>true</UseWindowsForms> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Hill-98
相关产品推荐
相关产品推荐

