Win11夜间模式(夜灯)强度调节

动作需求 · 1161 次浏览
心灵手小 创建于 2天14小时前

quicker目前只有屏幕亮度调节功能,但无法调整蓝光/色温。

 

win11工作栏右下角仅能直接开启/关闭夜间模式

 

缺少win11自带夜间模式的强度调节功能

 

申请快速调节夜间模式强度的新功能


回复内容
CL 2天13小时前
#1

后期考虑增加到模块里。 目前可以参考AI提供的方法:

----------------

如何通过c#、或powershell脚本,开启windows的夜间模式?以及设置夜间模式的强度?

GPT5:

可以,但要分两种思路:

  • 「官方 API」目前没有公开接口;系统把设置放在 CloudStore 的注册表二进制值里。常见做法是改注册表的二进制值或用现成的小工具封装好这些改动。(Super User)

  • 强度(“暖色”程度)本质上是色温,0%≈6500K,100%≈1200K。(Windows 11 Forum)

下面给你两条最稳的路径:PowerShell 版(纯脚本/或用现成模块)和 C# 版(通过注册表)。


方案 A:PowerShell(推荐)

1)用现成模块(最省心)

开源项目 nightlight-cli 已经把注册表二进制格式封装好了,并提供了 PowerShell 命令:

# 1. 导入模块(把项目里的 .psm1 路径改成你本机的)
Import-Module "C:\Tools\nightlight-cli\src\powershell\NightLight.psm1"

# 2. 开启夜间模式
Enable-NightLight

# 3. 设置强度(0~100,越大越暖)
Set-NightLightStrength -Percentage 65

# 4. 关闭夜间模式(需要时)
Disable-NightLight

该项目也提供 CLI/TS 实现,强度与色温的换算已内置(0%=6500K,100%=1200K)。(GitHub)

备注:此项目通过修改 CloudStore 注册表值实现,已在 Windows 11 22H2 实测可用,Win10 21H2 理论可用。(GitHub)

2)纯 PowerShell(不依赖第三方)

如果你不想引入外部模块,可以直接写入 CloudStore 的二进制数据。下面这个函数基于社区的逆向格式,可设置计划与色温;如果你只想“立刻打开+设置强度”,保留 Enabled/色温部分即可。

function Set-NightLight {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)][ValidateRange(0,100)]
        [int]$StrengthPercent,    # 0=6500K, 100=1200K
        [switch]$Enable,
        [switch]$Disable
    )

    # 百分比 -> 色温(K)
    $kelvin = [int][math]::Round(6500 - (6500-1200) * ($StrengthPercent/100.0))

    # —— 下方根据 21H2 及更高版本的 CloudStore 二进制布局写入 settings —— 
    # 该布局来自社区实测,能设置启用状态/时间/色温;此处用“全天启用”的思路,重点是启用位和色温两字节。
    # 如需带计划时段,可按引用答案给的完整脚本扩展(Start/End)。
    $data = @(0x43,0x42,0x01,0x00,0x0A,0x02,0x01,0x00,0x2A,0x06)
    $epoch = [System.DateTimeOffset]::Now.ToUnixTimeSeconds()
    $data += ($epoch -band 0x7F) -bor 0x80
    $data += (($epoch -shr 7) -band 0x7F) -bor 0x80
    $data += (($epoch -shr 14) -band 0x7F) -bor 0x80
    $data += (($epoch -shr 21) -band 0x7F) -bor 0x80
    $data += ($epoch -shr 28)
    $data += (0x2A,0x2B,0x0E,0x1D,0x43,0x42,0x01,0x00)

    if ($Enable) { $data += (0x02,0x01) }  # 启用
    # 若想保持开关不变,可不写入这两个字节;若要强制关闭,可改为不写或重写 state 键(见下)

    # 这里略去“计划时段”的字段,直接落到色温字段:
    $data += (0xCF,0x28)
    $tempLo = ((($kelvin -band 0x3F) * 2) + 0x80) -band 0xFF
    $tempHi = ($kelvin -shr 6) -band 0xFF
    $data += $tempLo, $tempHi
    $data += (0xCA,0x32,0x00,0xCA,0x3C,0x00,0x00,0x00,0x00,0x00)

    $key = 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.settings\windows.data.bluelightreduction.settings'
    Set-ItemProperty -Path $key -Name Data -Value ([byte[]]$data) -Type Binary

    # 如需“立即关闭”,可以改写 state 键或再次写入不含 0x02,0x01 的数据。
}

# 示例:开启并把强度设为 65%
Set-NightLight -Enable -StrengthPercent 65

参考与二进制字段说明详见该高票答案(含老版本/新版本两种布局与色温编码细节)。(Super User)

应用生效:通常立即生效。若未生效,可尝试重开“设置→显示→夜间模式”页面,或注销/重启资源管理器。二进制布局可能随版本细微变化,遇到异常时优先用上面的现成模块验证。(Super User)


方案 B:C#(两种写法)

1)最稳:C# 调用 PowerShell(复用上面的脚本或模块)

using System;
using System.Diagnostics;

class NightLight {
    public static void Set(bool enable, int strengthPercent) {
        // 传入 0~100
        var ps = $@"
$percent = {strengthPercent};
$enable = {enable.ToString().ToLower()};
if (-not (Get-Module -ListAvailable -Name NightLight)) {{
  # 这里假设你把 NightLight.psm1 放到固定路径
  Import-Module 'C:\Tools\nightlight-cli\src\powershell\NightLight.psm1'
}}
if ($enable) {{ Enable-NightLight }}
Set-NightLightStrength -Percentage $percent
";
        var p = new Process();
        p.StartInfo.FileName = "powershell.exe";
        p.StartInfo.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command " + "\"" + ps.Replace("\"", "`\"") + "\"";
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.CreateNoWindow = true;
        p.Start();
        p.WaitForExit();
    }
}

// 用法:开启并设为 65%
NightLight.Set(true, 65);

这个方式不必自己拼注册表二进制,维护成本最低。强度映射与兼容性由模块处理。(GitHub)

2)纯 C# 直接改注册表(二进制)

如果不想依赖 PowerShell,可以把上面 PowerShell 的二进制写法直接翻成 C#:计算 Unix 时间戳、色温两字节(0–5 位在低字节的 bit1–6,bit7 置 1;高字节存更高位),然后写入:
HKCU\...\default$windows.data.bluelightreduction.settings\windows.data.bluelightreduction.settingsData 值。完整字段/路径与编码说明见参考答案;需要你按版本微调。(Super User)


小结 & 注意

  • 强度与色温映射:0%→6500K,100%→1200K(线性换算即可)。(Windows 11 Forum)

  • 这套方法是“非公开格式 + 注册表写入”,但已被社区验证可用(Win11 22H2 实测,Win10 21H2 理论可用)。(GitHub)

  • 如果你只想“简单用”,直接用 nightlight-cli 的 PowerShell 命令最方便;要做企业级批量化或嵌入应用,则可以选纯脚本或 C# 改注册表。(GitHub)

需要我把 C# 的“纯注册表版本”也写成一个可直接调用的 SetNightLight(bool enabled, int strength) 类给你吗?


====================

Gemini:

好的,可以通过操作 Windows 注册表来实现使用 C# 或 PowerShell 开启/关闭夜间模式以及设置其强度。

夜间模式(Night Light)的设置主要存储在以下注册表路径中:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Cloud\$$windows.data.bluelightreduction.bluelightreductionstate\Current

在这个路径下,有一个名为 Data 的键,它存储了一个二进制值。通过解析和修改这个二进制值,就可以控制夜间模式。


1. PowerShell 脚本

使用 PowerShell 是最直接的方法,因为它能轻松地读取和修改注册表。

关键点解析

  1. 注册表路径$path = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Cloud\$$windows.data.bluelightreduction.bluelightreductionstate\Current'

  2. 数据结构Data 键的值是一个二进制 blob。我们需要关注其中的特定字节来控制开关和强度。

    • 开关状态:大约在第 0x18 (十进制 24) 偏移位置的字节。0x11 代表关闭,0x13 代表开启。

    • 强度值:大约在第 0x48 (十进制 72) 偏移位置的字节。它的值范围是 0x000x64,对应 0% 到 100% 的强度。

PowerShell 示例代码

这是一个封装好的 PowerShell 函数,你可以直接使用。

如何运行:

  1. 将上面的代码保存为一个 .ps1 文件(例如 SetNightLight.ps1)。

  2. 在 PowerShell 中,首先需要导航到脚本所在的目录。

  3. 如果这是你第一次运行脚本,可能需要设置执行策略:Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

  4. 加载函数:. .\SetNightLight.ps1

  5. 调用函数,如 Set-NightLight -State On -Strength 70


2. C# 代码

使用 C# 的逻辑是相同的:读取注册表项,修改字节数组,然后写回。

C# 示例代码

你需要创建一个 .NET 项目 (例如控制台应用) 来运行以下代码。

如何运行:

  1. 创建一个新的 C# 控制台项目(.NET Core 或 .NET Framework 均可)。

  2. 将上面的代码粘贴到 Program.cs 文件中。

  3. 在项目文件中,确保 PropertyGroup 中有 <PlatformTarget>x64</PlatformTarget>,因为注册表视图可能因应用程序的体系结构(x86/x64)而异。

  4. 运行项目。

重要提示

  • 首次使用:如果你的电脑从未开启过夜间模式,相关的注册表项可能不存在。你需要手动开启并关闭一次夜间模式,Windows 才会创建这些键值。

  • 延迟生效:通过注册表修改后,系统可能需要几秒钟才会应用新的设置,屏幕颜色才会变化。

  • 系统版本差异:以上方法在 Windows 10 和 Windows 11 的较新版本上测试有效。如果遇到问题,可能是因为 Windows 更新导致数据结构或注册表路径发生了变化。

心灵手小 回复 CL 2天10小时前 :

感谢回复。

刚到外网搜索,发现了微软没提供这个的api,外网也都在问。

现在考虑直接创建快捷方式/命令用来快速进入夜灯强度界面了,位置为【ms-settings:nightlight】

回复主贴