SetWindowCompositionAttribute 修改任务栏的颜色
可以通过 SetWindowCompositionAttribute()
函数来修改 Windows 10/11 任务栏的颜色。以下是一个简单的示例代码:
[DllImport("user32.dll")]
private static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data);
private void SetTaskbarBorderColor(Color color)
{
var hwnd = FindWindow("Shell_TrayWnd", null);
var accent = new AccentPolicy
{
AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND,
AccentFlags = 0x20,
GradientColor = ((uint)color.R << 16) | ((uint)color.G << 8) | color.B
};
var accentStructSize = Marshal.SizeOf(accent);
var accentPtr = Marshal.AllocHGlobal(accentStructSize);
Marshal.StructureToPtr(accent, accentPtr, false);
var data = new WindowCompositionAttributeData
{
Attribute = WindowCompositionAttribute.AccentPolicy,
SizeOfData = accentStructSize,
Data = accentPtr
};
SetWindowCompositionAttribute(hwnd, ref data);
Marshal.FreeHGlobal(accentPtr);
}
这个函数使用了 SetWindowCompositionAttribute()
函数来设置任务栏的边框颜色。具体来说,该函数会:
- 使用
FindWindow()
函数来获取任务栏窗口的句柄。 - 创建一个
AccentPolicy
结构体实例,其中包含了要设置的任务栏边框的颜色。 - 使用
Marshal.AllocHGlobal()
函数来分配一块非托管内存,用于存储AccentPolicy
结构体实例的数据。 - 使用
Marshal.StructureToPtr()
函数将AccentPolicy
结构体实例的数据复制到非托管内存中。 - 创建一个
WindowCompositionAttributeData
结构体实例,并将AccentPolicy
结构体的数据指针赋值给WindowCompositionAttributeData.Data
字段。 - 调用
SetWindowCompositionAttribute()
函数来设置任务栏边框的颜色。 - 最后使用
Marshal.FreeHGlobal()
函数释放非托管内存。
需要注意的是,该代码只能在 Windows 10/11 系统上运行,因为在其他系统上可能不存在 SetWindowCompositionAttribute()
函数。此外,由于该函数需要使用 P/Invoke 调用 Win32 API,因此需要在代码中引用一些系统命名空间。