在 WinUI3 中使用 SetWindowCompositionAttribute 更改颜色时任务栏颜色恢复

问题描述 投票:0回答:1

我在 Windows 上遇到任务栏颜色问题。当我使用

SetWindowCompositionAttribute
方法更改任务栏颜色时,颜色最初按预期更改。但是,一旦我单击“开始”按钮,任务栏颜色就会恢复为 Windows 设置指定的默认颜色。

重现步骤:

  1. 使用
    SetWindowCompositionAttribute
    更改任务栏颜色。
  2. 观察任务栏颜色变化。
  3. 单击“开始”按钮。
  4. 注意任务栏颜色恢复为 Windows 默认颜色。

预期行为:即使在与“开始”按钮交互后,任务栏颜色也应保持

SetWindowCompositionAttribute
设置的样子。

实际行为: 单击“开始”按钮时,任务栏颜色将恢复为默认 Windows 设置。

代码示例:

public static void SetTaskbarColor(Color color)
{
    var accentPolicy = default(User32Interop.AccentPolicy);

    accentPolicy.Color = color.ToAbgr();
    accentPolicy.AccentState = 2;
    accentPolicy.Flags = 2;

    var data = default(User32Interop.Windowcompositionattribdata);

    data.Attribute = User32Interop.WindowCompositionAttribute.WcaAccentPolicy;
    data.SizeOfData = Marshal.SizeOf(typeof(User32Interop.AccentPolicy));
    data.Data = Marshal.AllocHGlobal(data.SizeOfData);

    Marshal.StructureToPtr(accentPolicy, data.Data, false);

    var taskbarHandle = User32Interop.FindWindow("Shell_TrayWnd", null);

    var secondaryTaskbarHandle = User32Interop.FindWindow("Shell_SecondaryTrayWnd", null);

    if (taskbarHandle != nint.Zero)
    {
        User32Interop.SetWindowCompositionAttribute(taskbarHandle, ref data);
    }

    if (secondaryTaskbarHandle != nint.Zero)
    {
        User32Interop.SetWindowCompositionAttribute(secondaryTaskbarHandle, ref data);
    }

    Marshal.FreeHGlobal(data.Data);
}
c# windows winapi taskbar
1个回答
0
投票

此问题的答案在此线程上:https://learn.microsoft.com/en-us/answers/questions/2046028/taskbar-color-reverts-when-changing-color-using-se

解决方案是在 Timer 或 Thread 中添加改变任务栏颜色,这样会反复刷新任务栏

© www.soinside.com 2019 - 2024. All rights reserved.