本帖最后由 gytxtx 于 2025-1-30 17:02 编辑
新年第一帖,祝福大家新年快乐!
重要通知 | 经过本人测试,使用 DwmGetColorizationColor DLL 命令获取到的颜色值
与 实际颜色值(注册表获取的颜色值) 有差异。
请手动转换色彩空间以获取正确颜色。
如果您介意,请使用注册表方式获取。 |
起源
由于开发需要,我要将我的程序提供跟随 Windows 主题色的选项
论坛没有现成的源码(指 API 例程),好在有大佬提供了获取主题色的 API DwmGetColorizationColor 。
相关源码
此源码使用取注册表方式来获取 Windows 主题色
来源
于是我自己研究了一下,参考了 Microsoft Learn,并且问了 DeepSeek,就有了这个源码
相关 API 文档
原理
来自 ChatGPT 的原理介绍
这段代码的主要目的是通过调用 Windows API 获取当前系统的主题颜色以及是否启用了桌面窗口管理器(DWM)合成,并将颜色信息进行处理。以下是对代码的逐部分分析:
1. 函数:获取系统主题色
2. __启动窗口_创建完毕 子程序
3. zyARGB2RGB 子程序
4. 子程序_分解颜色值 子程序
5. API 调用
-
DwmGetColorizationColor :通过调用 Windows API 获取当前的主题色。这是 Windows 7 及以上版本的特性,返回值的格式为 0xAARRGGBB 。
-
DwmIsCompositionEnabled :通过调用 Windows API 检查桌面窗口管理器(DWM)是否启用,如果启用,表示可以支持透明和玻璃效果等视觉效果。
-
GetLastError :获取最后的错误代码,帮助调试可能的 API 调用失败。
6. 常量与枚举
S_OK : 表示成功的常量值(0 )。
S_FALSE : 表示失败的常量值(1 )。
TRUE 和 FALSE : 分别对应逻辑值 真 和 假 。
7. DLL 调用部分
DwmGetColorizationColor 和 DwmIsCompositionEnabled 被定义为 DLL 命令。通过调用 dwmapi.dll 中的函数来获取系统的 DWM 合成状态和主题颜色。
总结
这段代码的目的是获取 Windows 系统的主题颜色,并处理透明度和 RGB 通道。通过调用 DWM 的 API 函数,检查 DWM 是否启用,获取当前的主题颜色,并处理颜色信息。代码还包括对颜色值的处理和分解,最终将颜色应用到窗口背景中。
参考
ARGB 到 RGB 来自于 黑月界面类 模块。
分解颜色值(从十进制颜色值还原为 RGB) 来源于此帖:https://bbs.125.la/forum.php?mod=viewthread&tid=14820833
须知
如果开启了 从我的背景自动选取一种主题色,那么返回的颜色数值将会是黑色。
使用
此源码各位可随意转载、使用。
DWMAPIGetWindowsThemeColor.e
(9.2 KB, 下载次数: 3)
|