TranslucentTB DWM API:DwmSetWindowAttribute实现窗口透明度控制

TranslucentTB DWM API:DwmSetWindowAttribute实现窗口透明度控制

【免费下载链接】TranslucentTB 【免费下载链接】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 【免费下载链接】TranslucentTB 项目地址: https://gitcode.com/gh_mirrors/tra/TranslucentTB

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值