quicker目前只有屏幕亮度调节功能,但无法调整蓝光/色温。
win11工作栏右下角仅能直接开启/关闭夜间模式
缺少win11自带夜间模式的强度调节功能
申请快速调节夜间模式强度的新功能
后期考虑增加到模块里。 目前可以参考AI提供的方法:
----------------
如何通过c#、或powershell脚本,开启windows的夜间模式?以及设置夜间模式的强度?
GPT5:
可以,但要分两种思路:
「官方 API」目前没有公开接口;系统把设置放在 CloudStore 的注册表二进制值里。常见做法是改注册表的二进制值或用现成的小工具封装好这些改动。(Super User)
强度(“暖色”程度)本质上是色温,0%≈6500K,100%≈1200K。(Windows 11 Forum)
下面给你两条最稳的路径:PowerShell 版(纯脚本/或用现成模块)和 C# 版(通过注册表)。
开源项目 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)
如果你不想引入外部模块,可以直接写入 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)
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)
如果不想依赖 PowerShell,可以把上面 PowerShell 的二进制写法直接翻成 C#:计算 Unix 时间戳、色温两字节(0–5 位在低字节的 bit1–6,bit7 置 1;高字节存更高位),然后写入: HKCU\...\default$windows.data.bluelightreduction.settings\windows.data.bluelightreduction.settings 的 Data 值。完整字段/路径与编码说明见参考答案;需要你按版本微调。(Super User)
HKCU\...\default$windows.data.bluelightreduction.settings\windows.data.bluelightreduction.settings
强度与色温映射:0%→6500K,100%→1200K(线性换算即可)。(Windows 11 Forum)
这套方法是“非公开格式 + 注册表写入”,但已被社区验证可用(Win11 22H2 实测,Win10 21H2 理论可用)。(GitHub)
如果你只想“简单用”,直接用 nightlight-cli 的 PowerShell 命令最方便;要做企业级批量化或嵌入应用,则可以选纯脚本或 C# 改注册表。(GitHub)
需要我把 C# 的“纯注册表版本”也写成一个可直接调用的 SetNightLight(bool enabled, int strength) 类给你吗?
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 的键,它存储了一个二进制值。通过解析和修改这个二进制值,就可以控制夜间模式。
Data
使用 PowerShell 是最直接的方法,因为它能轻松地读取和修改注册表。
注册表路径:$path = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Cloud\$$windows.data.bluelightreduction.bluelightreductionstate\Current'
$path = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Cloud\$$windows.data.bluelightreduction.bluelightreductionstate\Current'
数据结构:Data 键的值是一个二进制 blob。我们需要关注其中的特定字节来控制开关和强度。
开关状态:大约在第 0x18 (十进制 24) 偏移位置的字节。0x11 代表关闭,0x13 代表开启。
0x18
0x11
0x13
强度值:大约在第 0x48 (十进制 72) 偏移位置的字节。它的值范围是 0x00 到 0x64,对应 0% 到 100% 的强度。
0x48
0x00
0x64
这是一个封装好的 PowerShell 函数,你可以直接使用。
如何运行:
将上面的代码保存为一个 .ps1 文件(例如 SetNightLight.ps1)。
.ps1
SetNightLight.ps1
在 PowerShell 中,首先需要导航到脚本所在的目录。
如果这是你第一次运行脚本,可能需要设置执行策略:Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
加载函数:. .\SetNightLight.ps1
. .\SetNightLight.ps1
调用函数,如 Set-NightLight -State On -Strength 70。
Set-NightLight -State On -Strength 70
使用 C# 的逻辑是相同的:读取注册表项,修改字节数组,然后写回。
你需要创建一个 .NET 项目 (例如控制台应用) 来运行以下代码。
创建一个新的 C# 控制台项目(.NET Core 或 .NET Framework 均可)。
将上面的代码粘贴到 Program.cs 文件中。
Program.cs
在项目文件中,确保 PropertyGroup 中有 <PlatformTarget>x64</PlatformTarget>,因为注册表视图可能因应用程序的体系结构(x86/x64)而异。
PropertyGroup
<PlatformTarget>x64</PlatformTarget>
运行项目。
首次使用:如果你的电脑从未开启过夜间模式,相关的注册表项可能不存在。你需要手动开启并关闭一次夜间模式,Windows 才会创建这些键值。
延迟生效:通过注册表修改后,系统可能需要几秒钟才会应用新的设置,屏幕颜色才会变化。
系统版本差异:以上方法在 Windows 10 和 Windows 11 的较新版本上测试有效。如果遇到问题,可能是因为 Windows 更新导致数据结构或注册表路径发生了变化。
感谢回复。
刚到外网搜索,发现了微软没提供这个的api,外网也都在问。
现在考虑直接创建快捷方式/命令用来快速进入夜灯强度界面了,位置为【ms-settings:nightlight】