可以通过 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() 函数来设置任务栏的边框颜色。具体来说,该函数会:

  1. 使用 FindWindow() 函数来获取任务栏窗口的句柄。
  2. 创建一个 AccentPolicy 结构体实例,其中包含了要设置的任务栏边框的颜色。
  3. 使用 Marshal.AllocHGlobal() 函数来分配一块非托管内存,用于存储 AccentPolicy 结构体实例的数据。
  4. 使用 Marshal.StructureToPtr() 函数将 AccentPolicy 结构体实例的数据复制到非托管内存中。
  5. 创建一个 WindowCompositionAttributeData 结构体实例,并将 AccentPolicy 结构体的数据指针赋值给 WindowCompositionAttributeData.Data 字段。
  6. 调用 SetWindowCompositionAttribute() 函数来设置任务栏边框的颜色。
  7. 最后使用 Marshal.FreeHGlobal() 函数释放非托管内存。

需要注意的是,该代码只能在 Windows 10/11 系统上运行,因为在其他系统上可能不存在 SetWindowCompositionAttribute() 函数。此外,由于该函数需要使用 P/Invoke 调用 Win32 API,因此需要在代码中引用一些系统命名空间。



如果您对C#游戏开发感兴趣,可以扫下面二维码加入我们的QQ群来一起学习交流

原创文章,转载请注明本文链接地址(违者必究):SetWindowCompositionAttribute 修改任务栏的颜色