使用C# 快速实现Windows系统任务栏透明

2024-09-06 16:52:14 浏览数 (3)

Windows系统,目前本地测试用的是win10系统,虽然系统有自带透明,但是实际上没啥效果。所以写了个小demo,用来使用C#语言开发的控制台程序,来实现更改任务栏背景实现透明效果。

先看下我现在的主题样式,自带的任务栏背景如下图,似乎不是很和谐。

代码编译以后,运行,我提供了几种不同的选项,大家可以根据自己需要进行设置。我此处设置的模糊透明效果(毛玻璃透明),输入3,自动设置完成。

程序自动设置了新的效果,如图所示,实现了透明毛玻璃效果。其他效果大家可以自行尝试。这个效果看起来明显舒服多了。

一些核心的代码说明。

1、枚举定义,有关定义和说明,我已经添加了注释,供参考。

代码语言:javascript复制
 public enum AccentState
{
     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            // 无效状态,通常用于错误处理或状态未定义
 }

2、控制台根据用户输入的数字,传入对应枚举参数进行更改任务栏效果的具体实现:

代码语言:javascript复制
public static void SetTaskbarTransparency(AccentState accentState)
{
    var taskbarHwnd = FindWindow("Shell_TrayWnd", null);
    if (taskbarHwnd != IntPtr.Zero)
    {
        var accent = new AccentPolicy();
        accent.AccentState = accentState;
        var accentStructSize = Marshal.SizeOf(accent);
        var accentPtr = Marshal.AllocHGlobal(accentStructSize);
        Marshal.StructureToPtr(accent, accentPtr, false);

        var data = new WindowCompositionAttributeData();
        data.Attribute = 19; 
        data.SizeOfData = accentStructSize;
        data.Data = accentPtr;

        SetWindowCompositionAttribute(taskbarHwnd, ref data);

        Marshal.FreeHGlobal(accentPtr);
    }
}

3、具体应用图示:

【注意】:由于这个demo获取了user32.dll的系统库的函数,所以某些杀软可能报毒,无视即可。

如果有需要以上测试源码的小伙伴,可以在我的gitee项目地址直接获取:

https://gitee.com/dreamer_j/transp-demo.git

如果只需要可执行程序的小伙伴,可以在源码库的发行版内直接下载:

https://gitee.com/dreamer_j/transp-demo/releases/tag/1

1 人点赞