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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:03:26