代码修改win10主题色并与WallpaperEngine同步
未搜到相关教程,故自行研究。直接上代码:https://github.com/Xrysnow/AccentColorSync

1. 代码修改win10主题色
获取主题色很简单,使用 DwmGetColorizationColor 即可。但微软没有公开修改主题色相关的API,只能自己找。通过IDA分析dwmapi.dll,可以找到两个相关的非公开API:
DwmpGetColorizationParameters(*)
DwmpSetColorizationParameters(*,BOOL)
其中指针参数指向的是一个结构体,和注册表中 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\DWM 的一些值对应,具体见代码。直接修改对应的注册表不会立即生效,需要重启DWM,并非正确做法。
使用API后发现只有边框颜色变了,查看注册表发现还有一个AccentColor项需要修改,好在该项修改会立即生效,加入代码即可。需要注意的是,若先调用API再修改AccentColor会使边框变黑,反之则正常。

2. 与WallpaperEngine同步
WallpaperEngine虽然提供了修改主题色的功能,但只能设置一次,不好用。本文的目标是在使用Personal Slideshow换图的同时自动更新主题色。
由于基于网页的壁纸在WallpaperEngine中是运行在CEF上的,所以可以在网页脚本里进行通信,让另一个程序来换色。由于http请求会遇到跨域问题,故使用WebSocket通信,并用python编写服务端。
程序大致流程如下:网页壁纸换图时将图片路径发给服务端 -> 服务端读取图片并计算主题色 -> 服务端设置系统主题色。
通过通信还可以实现更多更复杂的功能,例如和音乐/当前程序/外部设备同步,把信息发送给壁纸显示,实现桌面小组件等等。

本文仅针对win10进行研究,在21H2版本上测试,其他版本的windows请自行研究。