通过注册表配置Windows Creators Update Night Light


13

如何通过注册表配置Windows 10(Pro)Creators Update中的新夜灯功能?

使用我选择的配置管理工具(Chef)时,我想自动配置新的/更新的安装。通过Sysinternals Process Monitor进行的系统检查显示,二进制Data密钥已在深处进行了更新HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current,但这是一个很大的REG_BINARY blob,并不是很有用。

我们非常感谢您提供有关其他注册表,PowerShell或其他自动化友好方式来配置夜灯功能的帮助!


使用RegfromApp可以更好地跟踪它。它生成.reg文件。也许它可以对其进行解码
magicandre1981 '17

感谢您的建议@ magicandre198。过程监视器为我提供了要更改的确切键和值。问题在于密钥是二进制密钥,并且没有有关该数据密钥如何构建的解码文档。给定所讨论的时髦路径,这可能不是旨在直接修改的部分(也许是缓存的设置位置)。我希望有人能够管理新的Night Light功能,因为到目前为止,关于它的信息似乎很少。
David F. Severski

如我所说,使用Regfromapp,它会为每次更改生成.reg文件。
magicandre1981 '17

1
我们可能在这里互通有无。:)我知道按键和按键的内容正在调整。这只是一个笨拙的斑点,没有文档。我已经找到了github.com/jaapbrasser/SharedScripts/tree/master/Set-BlueLight,它做了一些修改以提供该功能的PS界面,但是目前尚不清楚如何将各种设置组合在一起。我真的在寻找有关如何将此二进制字符串组合在一起的文档(和接口)。
David F. Severski

Answers:


12

通过大量的试验,我设法或多或少地得出了该注册表值的格式(有关此内容的详细信息,请参见下文)。

我制作了以下PowerShell脚本:

Function Set-BlueLightReductionSettings {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$StartHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$StartMinutes,
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$EndHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$EndMinutes,
        [Parameter(Mandatory=$true)] [bool]$Enabled,
        [Parameter(Mandatory=$true)] [ValidateRange(1200, 6500)] [int]$NightColorTemperature
    )
    $data = (2, 0, 0, 0)
    $data += [BitConverter]::GetBytes((Get-Date).ToFileTime())
    $data += (0, 0, 0, 0, 0x43, 0x42, 1, 0)
    If ($Enabled) {$data += (2, 1)}
    $data += (0xCA, 0x14, 0x0E)
    $data += $StartHour
    $data += 0x2E
    $data += $StartMinutes
    $data += (0, 0xCA, 0x1E, 0x0E)
    $data += $EndHour
    $data += 0x2E
    $data += $EndMinutes
    $data += (0, 0xCF, 0x28)
    $tempHi = [Math]::Floor($NightColorTemperature / 64)
    $tempLo = (($NightColorTemperature - ($tempHi * 64)) * 2) + 128
    $data += ($tempLo, $tempHi)
    $data += (0xCA, 0x32, 0, 0xCA, 0x3C, 0, 0)
    Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current' -Name 'Data' -Value ([byte[]]$data) -Type Binary
}

要使用它,请将其另存为.ps1文件,然后按照PowerShell标签Wiki的“启用脚本”部分中说明进行操作。然后,您可以通过点源导入脚本的内容:

. ./bluelightmanagement.ps1

然后使用它提供的类似于cmdlet的函数:

Set-BlueLightReductionSettings -StartHour 7 -StartMinutes 0 -EndHour 21 -EndMinutes 15 -Enabled $true -NightColorTemperature 6000

结果

如果在运行命令时打开了蓝光减少页面,则“设置”应用程序甚至会立即更新所有内容(颜色滑块除外)。

格式

  • 4个恒定字节-似乎是所有CloudStore值共有的签名
  • 设置的最后修改时间为64位FILETIME值(8字节,小端)
  • 另外8个常量字节
  • 如果启用了蓝光减少功能,则字节数,如果禁用2则不显示1
  • 3个更多的恒定字节
  • 开始时间的小时数(1个字节)
  • 1个恒定字节
  • 开始时间的分钟数(1个字节)
  • 4个恒定字节
  • 结束时间的小时数(1个字节)
  • 1个恒定字节
  • 结束时间的分钟数(1个字节)
  • 3个恒定字节
  • 经过一些奇怪的二进制数学运算(2字节)后,开尔文的夜间色温
  • 7个恒定字节

色温以小字节序存储为两个字节。高值1是温度除以64的结果的整数部分。低值字节是余数乘以2,然后加到128。要从字节计算温度,请将高字节乘以64加上将低字节和128之差除以2后得到的结果。


我正在尝试编写仅打开和关闭夜灯的脚本。如果我没记错的话,字节20和21应该指示该功能是否开启(至少根据您的描述,因为4 + 8 + 8 = 20),但是当我使用regedit查看注册表项时,我不会看到第21个字节发生了变化,对此我完全看不到任何变化。我已经确定我用F5刷新了regedit窗口,甚至在我从UI切换了夜灯功能后也重新打开了它。您是否知道发生了什么?
Gaboik1年

1
我还发现,使用NirSoft nirsoft.net/articles/find_modified_time_registry_key.html的此实用程序,当我激活和停用夜灯功能时,您指定的注册表项根本没有被修改。也许微软在上次更新中更改了它?
Gaboik1

1
@ Gaboik1这个注册表值有点奇怪,因为它的布局发生了很大变化。我描述的格式只是一种有效的格式,不一定是唯一的格式。我不知道一种从该值中连续读取数据的方法,但是我在Windows 10 1709上进行了测试,并且使用此脚本设置设置仍然有效。
本N

在.net中编写此代码,我发现实际上使用了日程表(与您的代码相对应,这似乎是由日出/日落进行的),我不得不在CA 14 0E之前添加字节0xC2,0x0A,0x00。然后它将触发并将其设置为基于小时。否则它会起作用。1709
。– Mgamerz '18年

@Mgamerz可以确认这是正确的,并且可以在1809年工作。对答案进行了编辑。
变态

2

几个小时的实验和结果:
如何在Win10 1903中打开/关闭夜灯

注册表项是

HKCU\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.bluelightreductionstate\windows.data.bluelightreduction.bluelightreductionstate\

值名称:数据

启用夜灯

  1. 将字节“ 10”和“ 00”分别添加到24和25索引上的数据,这样所有数据长度都会增加(不要更改现有值,只需再添加两个字节)
  2. 将11或12个索引的值增加1(例如:如果现在是FF 01,则现在分别需要是00 02)实际上,现在看来是时候了,它以8位字节的小端格式写入,因此您需要如果要精确的话,还有13、14、15、16、17和18个索引。

禁用夜灯

  1. 分别从24和25个索引的数据中删除字节“ 10”和“ 00”,以便所有数据长度减小
  2. 将11或12索引的值增加1(例如:如果现在是FF 01,则现在需要分别是00 02)

我只需要为程序打开/关闭夜灯,所以不幸的是,所有其他选项仍然需要研究。但是,似乎所有其他调整(例如更改温度和进度)的关键选择是适当增加时间。这些mod需要在相邻注册表项windows.data.bluelightreduction.settings中的另一个Data值中完成。


您是否碰巧有脚本来启用或禁用此功能?
变形

没有。我在C.写的一个小程序
hgrev

如果您可以发布链接,则仍然会很有用(至少对我而言)。我从事C / C ++工作
变形

您是否需要代码或exe文件?
hgrev

1
这是源代码和可执行文件:github.com/inamozov/DisplayTest
hgrev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.