Windows10 自动黑暗颜色模式


  2020 年的当下,主流系统和不少软件都支持了黑色主题,本站也对黑色主题进行了适配。但是 Windows10 本身并没有定时启用黑色主题功能,那么就需要我们自己进行设置。

  基本思路来自 2015 年的文章 How to turn on Windows 10 Dark Theme using Registry Tweak,本质是通过修改注册表的方式切换主题。经过我的测试,发现 Windows 监听了文中的注册表项,修改注册表后会立即切换。

  根据文章我们可以知道,这个项目保存到了 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\PersonalizeSystemUsesLightThemeAppsUseLightTheme 中。

  其中 SystemUsesLightTheme 是系统颜色模式,AppsUseLightTheme 是应用颜色模式,DWORD 为 1 代表浅色,0 代表深色。

  现在我们就可以根据以上信息得到四句修改注册表的命令:


//深色
reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 0 /f
reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v AppsUseLightTheme /t REG_DWORD /d 0 /f


//浅色
reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 1 /f
reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v AppsUseLightTheme /t REG_DWORD /d 1 /f

  此时我们需要老朋友 任务计划程序 来定时执行我们的命令:

20201122211958 20201122212004 20201122212004 20201122212013 20201122212017 20201122212024

  浅色模式也一样,确定即可。


2020/11/24 更新


需要开启 第一张图片 > 常规 > 使用最高权限运行,否则在某些情况下可能导致命令执行失败。

由于 任务计划程序 只有定时启动,没有在某个时间段后开机立即启动,所以单纯设置两个任务计划只能保证开机状态下的主题切换,如果在执行计划的时间,电脑处于关机状态,那么就不能保证真正的自动切换,所以需要我们再添加一个任务计划来在开机时执行。

由于任务计划本身是不包含逻辑判断的,那么就需要使用 Powershell 或者 C++ 来进行判断。

PowerShell :


PowerShell if(([int](Get-Date -Format %H) -gt 6) -and ([int](Get-Date -Format %H) -lt 20)) {reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 1 /f} else {reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 0 /f}

PowerShell if(([int](Get-Date -Format %H) -gt 6) -and ([int](Get-Date -Format %H) -lt 20)) {reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v AppsUseLightTheme /t REG_DWORD /d 1 /f} else {reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize /v AppsUseLightTheme /t REG_DWORD /d 0 /f}

或者 C++ :


#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
 
int main()
{
   time_t now = time(0);
   tm *ltm = localtime(&now);
   short h = ltm->tm_hour;
   if (h > 5 && h < 20){
       system("reg add HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 1 /f");
       system("reg add HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize /v AppsUseLightTheme /t REG_DWORD /d 1 /f");
   } else {
       system("reg add HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 0 /f");
       system("reg add HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize /v AppsUseLightTheme /t REG_DWORD /d 0 /f");
   }
}


2020/11/25 更新


今天发现了一个新的问题:Windows 处于休眠或者睡眠状态时,任务不会被执行,我 Bing 了一下,从 V2EX 的一个问题下面得到了一部分答案和思路:win10 怎样设置休眠唤醒后执行程序?

文中给出了用 Windows Power-Troubleshooter 事件触发任务计划代码方法,但是 Windows 在睡眠中唤醒,并不会触发 Power-Troubleshooter 事件。

不过他这个方法隐含着一个思路:用 Windows 事件触发任务计划。

由于用 Windows 事件触发任务计划需要知道三件事:日志文件类别,日志来源,事件 ID,那么我们就可以使用 Windows 事件查看器获得这三个事件。

我们可以先记下当前时间,然后睡眠/关机/休眠,这样事件查看器里就会留下事件记录。

打开事件查看器,展开到 系统。

20201125221939

此时右侧就能看到各种事件,此时我们根据时间和来源就可以判断我们需要的到底是哪个事件:

20201125214122

这个事件来源是 Kernel-Power,ID 507。事件是从睡眠状态唤醒 Windows,原因是我们使用了鼠标。

20201125214133

这个事件来源是 Kernel-Power,ID 507。事件是从睡眠状态唤醒 Windows,原因是我们使用了键盘(这条不需要,和上一条等效)。

20201125220511

这个事件来源是 Kernel-General,ID 1。事件是调整事件,原因是系统时间因为关机,所以根据 BIOS 调整(这条不需要)。

20201125220818

这个事件来源是 Power-Troubleshooter,ID 1。事件是从低功耗状态下唤醒,原因是我们退出了了关机/休眠状态。

经过我的测试,退出关机/休眠 都会触发 Power-Troubleshooter ID 1 事件,所以我们只需要这一个事件就可以。

那么我们就需要这样的一个计划任务

20201125221835 20201125221717 20201125221809 20201125221819 20201125221829


2020/11/26 更新


注意:本方法并不能保证壁纸 100% 生效,原因是

RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
不可靠

今天我又研究了一下 PowerShell 怎么更换壁纸,参考了如下文章:

Window10定时换壁纸

Win10当前壁纸保存位置

【Answers 分享】如何删除Win10背景图片(壁纸)历史记录

我们得到两个目录:

%userprofile%\AppData\Local\Microsoft\Windows\Themes

%userprofile%\AppData\Roaming\Microsoft\Windows\Themes

第一个目录是主题位置,第二个目录是当前壁纸缓存。

我们首先需要在 PowerShell 里执行 cmd /c echo "%userprofile%\AppData\Local\Microsoft\Windows\Themes" 得到完整目录,然后将输出的结果复制下来。

然后将想要更换的两张壁纸放入这个目录,再在之前我们设置好的开关机触发的任务计划中添加如下操作:


PowerShell if(([int](Get-Date -Format %H) -gt 6) -and ([int](Get-Date -Format %H) -lt 20)) {reg add reg add "hkcu\control panel\desktop" /v wallpaper /d "浅色图片地址" /f} else {reg add reg add "hkcu\control panel\desktop" /v wallpaper /d "深色图片地址" /f /t REG_DWORD /d 0 /f}
RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters

浅色触发的:


reg add reg add "hkcu\control panel\desktop" /v wallpaper /d "浅色图片地址" /f /t REG_DWORD /d 0 /f
RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters

深色触发的:


reg add reg add "hkcu\control panel\desktop" /v wallpaper /d "深色图片地址" /f /t REG_DWORD /d 0 /f
RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters

即可实现随着自动切换颜色模式而切换壁纸。