You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过命令行或脚本可控地开启/关闭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状态无需恢复"
    }
}

三、使用方式

  1. 把上面的脚本保存为HdrGameLauncher.ps1文件;
  2. 创建一个快捷方式,目标栏填写:
    powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\HdrGameLauncher.ps1"
    
    (替换成你实际的脚本路径)
  3. 双击这个快捷方式,就能自动完成HDR关闭→启动游戏→恢复HDR的流程了。

你之前找的旧工具失效,大概率是因为Win11更新了HDR的底层框架,而那些工具还是用的旧接口。上面的脚本用的是Windows官方提供的API,稳定性和兼容性会好很多,也不会依赖Xbox游戏栏。

备注:内容来源于stack exchange,提问作者therks

火山引擎 最新活动