如何通过命令行或脚本可控地开启/关闭Windows HDR模式?
如何通过命令行或脚本可控地开启/关闭Windows HDR模式?
我太懂你这种需求了——毕竟有些老游戏或者优化不到位的游戏一碰到HDR就出问题,盲切换的工具要么不管用,要么没法精准控制状态,确实头疼。结合你想要的「关闭HDR→启动游戏→退出后恢复」的流程,给你几个靠谱的PowerShell方案,完全可控,不用依赖Xbox游戏栏:
一、精准查询+控制HDR状态的核心脚本
我们可以用Windows官方API直接读取和设置HDR状态,彻底避免盲切换的问题。这里提供两种适配不同Windows版本的写法:
方法1:WMI类(适合Windows 10/11大部分版本)
这个方法通过WMI直接操作显示器参数,简单直观:
# 1. 查询当前HDR状态 $currentHdrState = (Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorDisplayParams).HdrEnabled Write-Host "当前HDR状态:$($currentHdrState ? '已开启' : '已关闭')" # 2. 关闭HDR Set-CimInstance -Namespace root\wmi -ClassName WmiMonitorDisplayParams -Property @{HdrEnabled = $false} # 3. 开启HDR Set-CimInstance -Namespace root\wmi -ClassName WmiMonitorDisplayParams -Property @{HdrEnabled = $true}
⚠️ 注意:这个脚本需要管理员权限运行,否则可能无法修改显示器参数。
方法2:WinRT API(适配Windows 11最新版本)
如果上面的WMI方法在你的Win11上失效,可以试试调用Windows Runtime的官方API,兼容性更好:
# 加载必要的.NET程序集 Add-Type -AssemblyName System.Runtime.WindowsRuntime # 定义通用的Async转Task方法 $asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where-Object { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0] # 获取当前显示的高级色彩信息(包含HDR状态) $displayInfo = [Windows.Graphics.Display.DisplayInformation]::GetForCurrentView() $getInfoAsync = $displayInfo.GetType().GetMethod("GetAdvancedColorInfoAsync") $asyncOp = $getInfoAsync.Invoke($displayInfo, $null) $task = $asTaskGeneric.MakeGenericMethod([Windows.Graphics.Display.AdvancedColorInfo]).Invoke($null, @($asyncOp)) $advancedColorInfo = $task.GetAwaiter().GetResult() # 查询HDR状态 $hdrEnabled = $advancedColorInfo.IsAdvancedColorEnabled Write-Host "当前HDR状态:$($hdrEnabled ? '已开启' : '已关闭')" # 设置HDR状态($true开启,$false关闭) $setStateAsync = $displayInfo.GetType().GetMethod("SetAdvancedColorStateAsync") $asyncSetOp = $setStateAsync.Invoke($displayInfo, @($false)) # 这里替换为$true就是开启 $setTask = $asTaskGeneric.MakeGenericMethod([System.Boolean]).Invoke($null, @($asyncSetOp)) $setResult = $setTask.GetAwaiter().GetResult() Write-Host "HDR状态设置结果:$setResult"
二、整合游戏启动的完整脚本
把上面的逻辑整合起来,就能实现你想要的自动流程:先保存当前HDR状态,关闭HDR,启动游戏,等游戏退出后恢复原状态。
这里以WMI方法为例,写一个完整的脚本:
# 管理员权限检查 $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { # 重新以管理员身份启动脚本 Start-Process powershell.exe "-ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs exit } # 保存原始HDR状态 $originalHdrState = (Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorDisplayParams).HdrEnabled Write-Host "原始HDR状态:$($originalHdrState ? '已开启' : '已关闭')" try { # 如果原本HDR是开启的,就关闭它 if ($originalHdrState) { Set-CimInstance -Namespace root\wmi -ClassName WmiMonitorDisplayParams -Property @{HdrEnabled = $false} Write-Host "已关闭HDR,准备启动游戏..." } # 替换成你的游戏路径和启动参数 $gamePath = "C:\Games\YourGame.exe" $gameArgs = "-fullscreen" # 可选,游戏的启动参数 $gameProcess = Start-Process -FilePath $gamePath -ArgumentList $gameArgs -PassThru # 等待游戏进程退出 $gameProcess.WaitForExit() Write-Host "游戏已退出,准备恢复HDR状态..." } finally { # 不管游戏正常退出还是意外崩溃,都恢复原始HDR状态 $currentHdrState = (Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorDisplayParams).HdrEnabled if ($originalHdrState -ne $currentHdrState) { Set-CimInstance -Namespace root\wmi -ClassName WmiMonitorDisplayParams -Property @{HdrEnabled = $originalHdrState} Write-Host "已恢复HDR状态为:$($originalHdrState ? '开启' : '关闭')" } else { Write-Host "HDR状态无需恢复" } }
三、使用方式
- 把上面的脚本保存为
HdrGameLauncher.ps1文件; - 创建一个快捷方式,目标栏填写:
(替换成你实际的脚本路径)powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\HdrGameLauncher.ps1" - 双击这个快捷方式,就能自动完成HDR关闭→启动游戏→恢复HDR的流程了。
你之前找的旧工具失效,大概率是因为Win11更新了HDR的底层框架,而那些工具还是用的旧接口。上面的脚本用的是Windows官方提供的API,稳定性和兼容性会好很多,也不会依赖Xbox游戏栏。
备注:内容来源于stack exchange,提问作者therks




