TranslucentTB DWM API:DwmSetWindowAttribute实现窗口透明度控制
【免费下载链接】TranslucentTB 项目地址: https://gitcode.com/gh_mirrors/tra/TranslucentTB
核心原理与API概述
Windows桌面窗口管理器(DWM, Desktop Window Manager)提供的DwmSetWindowAttribute函数是实现窗口透明度控制的核心接口。在TranslucentTB项目中,这一API被封装在未公开的系统调用中,通过修改窗口合成属性实现任务栏透明效果。项目通过Common/undoc/user32.hpp定义了相关数据结构,构建了完整的透明度控制逻辑。
关键数据结构解析
ACCENT_STATE枚举
该枚举定义了窗口背景渲染的六种状态,从完全禁用透明到亚克力模糊效果:
enum ACCENT_STATE : INT {
ACCENT_DISABLED = 0, // 禁用透明效果
ACCENT_ENABLE_GRADIENT = 1, // 启用渐变背景
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,// 启用透明渐变
ACCENT_ENABLE_BLURBEHIND = 3, // 启用模糊背景
ACCENT_ENABLE_ACRYLICBLURBEHIND = 4, // 启用亚克力模糊
ACCENT_ENABLE_HOSTBACKDROP = 5, // 启用宿主背景
ACCENT_INVALID_STATE = 6 // 无效状态(完全透明)
};
ACCENT_POLICY结构体
用于配置窗口透明度的具体参数,包含状态设置、颜色值和动画ID:
struct ACCENT_POLICY {
ACCENT_STATE AccentState; // 背景效果类型
UINT AccentFlags; // 标志位(设为2时启用GradientColor)
COLORREF GradientColor;// 背景颜色(ARGB格式)
LONG AnimationId; // 动画ID(保留字段)
};
实现流程与代码示例
1. 加载系统函数
通过动态加载user32.dll获取未公开的窗口合成属性设置函数:
typedef BOOL (WINAPI* PFN_SET_WINDOW_COMPOSITION_ATTRIBUTE)(
HWND, const WINDOWCOMPOSITIONATTRIBDATA*
);
// 加载函数地址
HMODULE hUser32 = LoadLibrary(L"user32.dll");
PFN_SET_WINDOW_COMPOSITION_ATTRIBUTE SetWindowCompositionAttribute =
(PFN_SET_WINDOW_COMPOSITION_ATTRIBU)GetProcAddress(hUser32, "SetWindowCompositionAttribute");
2. 配置透明策略
以亚克力模糊效果为例,构造ACCENT_POLICY并应用到目标窗口:
// 配置亚克力模糊(80%透明度的蓝色背景)
ACCENT_POLICY policy = {
.AccentState = ACCENT_ENABLE_ACRYLICBLURBEHIND,
.AccentFlags = 2,
.GradientColor = 0xCC'00'78'FF, // A=0xCC(80%), R=0x00, G=0x78, B=0xFF
.AnimationId = 0
};
// 构造属性数据结构
WINDOWCOMPOSITIONATTRIBDATA data = {
.Attrib = WCA_ACCENT_POLICY,
.pvData = &policy,
.cbData = sizeof(policy)
};
// 应用到任务栏窗口
SetWindowCompositionAttribute(hTaskbarWnd, &data);
3. 颜色值计算
GradientColor采用32位ARGB格式,透明度由高字节控制:
// 计算ARGB颜色值(透明度80%的红色)
COLORREF redWithAlpha = 0xCC'FF'00'00; // A=0xCC, R=0xFF, G=0x00, B=0x00
项目应用与资源文件
TranslucentTB的资源文件中包含多语言支持和图标资源,例如应用商店图标:
配置文件settings.schema.json定义了用户可配置的透明度参数,通过Common/config/config.hpp实现配置管理。
兼容性与注意事项
系统版本要求
- 亚克力效果(
ACCENT_ENABLE_ACRYLICBLURBEHIND)需Windows 10 1809+ - 宿主背景(
ACCENT_ENABLE_HOSTBACKDROP)需Windows 11 22H2+ - 可通过Common/win32.hpp中的
IsAtLeastBuild方法检测系统版本:
bool isWin11OrLater = win32::IsAtLeastBuild(22000);
线程安全
窗口属性修改需在UI线程执行,项目中通过TranslucentTB/windows/window.cpp的消息循环机制确保线程安全。
扩展应用与场景
动态切换效果
通过任务栏状态变化触发透明度调整,实现代码位于TranslucentTB/taskbar/taskbarattributeworker.cpp,支持以下场景:
- 活动窗口时的模糊效果
- 全屏应用时的自动隐藏
- 自定义规则匹配(如特定应用运行时)
多语言支持
资源文件AppPackage/Strings/zh-CN/Resources.resw包含透明度相关的本地化字符串,实现界面元素的中文显示。
总结
TranslucentTB通过封装DWM私有API,构建了灵活的窗口透明度控制框架。核心实现依赖于ACCENT_POLICY配置和SetWindowCompositionAttribute调用,结合系统版本检测和线程安全机制,为用户提供了丰富的任务栏美化选项。开发者可通过项目源码中的Common/undoc/目录深入了解更多未公开的系统接口使用方法。
【免费下载链接】TranslucentTB 项目地址: https://gitcode.com/gh_mirrors/tra/TranslucentTB
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




