开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 423|回复: 9
收起左侧

[易语言纯源码] 【半原创】使用 DWM(桌面窗口管理器) API 获取 Windows 主题色

[复制链接]
结帖率:100% (16/16)
发表于 4 天前 | 显示全部楼层 |阅读模式   美国
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
本帖最后由 gytxtx 于 2025-1-30 17:02 编辑

新年第一帖,祝福大家新年快乐!


重要通知
经过本人测试,使用 DwmGetColorizationColor DLL 命令获取到的颜色值
与 实际颜色值(注册表获取的颜色值) 有差异。
请手动转换色彩空间以获取正确颜色。

如果您介意,请使用注册表方式获取。


起源

由于开发需要,我要将我的程序提供跟随 Windows 主题色的选项

论坛没有现成的源码(指 API 例程),好在有大佬提供了获取主题色的 API DwmGetColorizationColor

相关源码

此源码使用取注册表方式来获取 Windows 主题色

来源

于是我自己研究了一下,参考了 Microsoft Learn,并且问了 DeepSeek,就有了这个源码

相关 API 文档

原理


来自 ChatGPT 的原理介绍

这段代码的主要目的是通过调用 Windows API 获取当前系统的主题颜色以及是否启用了桌面窗口管理器(DWM)合成,并将颜色信息进行处理。以下是对代码的逐部分分析:

1. 函数:获取系统主题色

  • 功能:该函数尝试获取当前系统主题的颜色(通常是玻璃效果的颜色,通常由透明色和主题色组成)。它首先检查 DWM 是否启用,如果启用,则调用 DwmGetColorizationColor 来获取颜色。

  • 步骤

    • DwmIsCompositionEnabled:检查桌面窗口管理器(DWM)是否启用。DWM 提供玻璃效果、透明窗口等特性。
    • 如果启用,继续执行获取颜色。
    • 如果未启用,返回 -1,并输出相关调试信息。
    • DwmGetColorizationColor:获取颜色并通过位操作分解出透明度和颜色通道(ARGB格式)。
    • 如果成功,返回颜色值;否则,返回 -1
  • 参数及变量

    • DwmIsCompositionEnabled_返回值: 存储 DwmIsCompositionEnabled 的返回值(用于检测 DWM 是否启用)。
    • DWM启用状态: 存储 DWM 合成状态。
    • DwmGetColorizationColor_返回值: 存储 DwmGetColorizationColor 函数的返回值(表示是否成功获取颜色)。
    • 颜色值: 存储获取到的颜色值(整数型)。
    • 不透明混合: 存储是否启用不透明混合。
    • 红色, 绿色, 蓝色, 透明度: 存储从 ARGB 颜色值中提取的各个通道的值。

2. __启动窗口_创建完毕 子程序

  • 功能:在窗口创建完毕时调用 获取系统主题色 来获取主题色并进行处理。结果通过调试输出显示,并设置窗口背景颜色为获取到的 RGB 颜色。

  • 步骤

    • 调用 获取系统主题色() 获取系统主题色。
    • 如果成功,分解颜色值并通过 子程序_分解颜色值 处理颜色通道(ARGB -> RGB)。
    • 设置背景颜色:根据颜色值,设置窗口的背景颜色。
    • 调试输出相关的颜色信息。

3. zyARGB2RGB 子程序

  • 功能:将 ARGB 格式的颜色值转换为 RGB 格式。

  • 步骤

    • 参数_ARGB:输入的 ARGB 颜色值。
    • 通过位操作提取出 RGB 通道,并将它们合并为 RGB 格式(0xRRGGBB)。
    • 返回转换后的 RGB 颜色值,并将透明度存储在 参数_透明度 中。

4. 子程序_分解颜色值 子程序

  • 功能:将十进制的颜色值(如 ARGB 格式)分解成单独的颜色通道(红、绿、蓝、透明度)。

  • 步骤

    • 将输入的颜色值转换为字节集。
    • 提取字节集中的 RGB 值(若有 alpha 通道也会提取)。
    • 通过字符串拼接返回颜色的字符串格式 r,g,b,a

5. API 调用

  • DwmGetColorizationColor:通过调用 Windows API 获取当前的主题色。这是 Windows 7 及以上版本的特性,返回值的格式为 0xAARRGGBB

  • DwmIsCompositionEnabled:通过调用 Windows API 检查桌面窗口管理器(DWM)是否启用,如果启用,表示可以支持透明和玻璃效果等视觉效果。

  • GetLastError:获取最后的错误代码,帮助调试可能的 API 调用失败。

6. 常量与枚举

  • S_OK: 表示成功的常量值(0)。
  • S_FALSE: 表示失败的常量值(1)。
  • TRUEFALSE: 分别对应逻辑值

7. DLL 调用部分

  • DwmGetColorizationColorDwmIsCompositionEnabled 被定义为 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)

签到天数: 3 天

发表于 3 小时前 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

签到天数: 2 天

发表于 昨天 19:57 | 显示全部楼层   江苏省连云港市
感谢分享
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 昨天 09:02 | 显示全部楼层   江苏省徐州市
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 1 天

发表于 昨天 08:17 | 显示全部楼层   江西省上饶市
很不错的东东
回复 支持 反对

使用道具 举报

签到天数: 2 天

发表于 前天 21:28 | 显示全部楼层   江苏省连云港市

感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (21/21)

签到天数: 2 天

发表于 前天 08:19 | 显示全部楼层   吉林省辽源市
感谢您对论坛的支持,这个不错
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 3 天前 | 显示全部楼层   河北省邯郸市
6666666666666666
回复 支持 反对

使用道具 举报

签到天数: 2 天

发表于 3 天前 | 显示全部楼层   江苏省连云港市

感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 3 天

发表于 3 天前 | 显示全部楼层   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表