获取 Aero 窗口颜色

3

我使用WPF制作了一个相当漂亮的类似于Windows 8的界面。它已经比我想象中的要好得多了,但我想知道以下问题:

是否有可能检索用户设置的当前窗口颜色?你知道的,你可以在右键单击桌面时设置Aero颜色... 我的计划是将该颜色用于我的GUI上的一些画布元素。

提前感谢!


可能是 https://dev59.com/7XRB5IYBdhLWcg3wa2q2 的重复问题,如何在程序中将 WPF 控件的颜色设置为系统颜色。 - Surfbutler
3
正确的方法是使用P/Invoke调用DwmGetColorizationColor()函数。 - Hans Passant
4个回答

5

为此,存在着一个名为SystemColours的类。您可以直接绑定到它,如下所示:

"{DynamicResource {x:Static SystemColors.WindowColorKey}}"

非常简单!非常感谢! - user1665567

4
你可以查询ColorizationColor注册表键以获取此信息。
我甚至更进一步,创建了一个方法来获取十六进制颜色值,希望这对你有所帮助:
public void SomeMethod()
{
    int argbColor = (int)Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM","ColorizationColor", null);
    var color = System.Drawing.Color.FromArgb(argbColor);
    string hexadecimalColor = ConverterToHex(color);
}


private static String ConverterToHex(System.Drawing.Color c)
{
    return String.Format("#{0}{1}{2}", c.R.ToString("X2"), c.G.ToString("X2"), c.B.ToString("X2"));
}

我使用了你的代码,因为我需要在代码后台中使用颜色。我想最好把它们全部放在一起以保持可读性。 - user1665567
我的答案也会在 Aero 颜色实际改变时改变颜色(在启用自动着色的情况下,这在 Windows 8 中经常发生)。 - Mathias Lykkegaard Lorenzen
我如何判断这个值是否通过绑定到SystemColors.WindowColorKey而改变? - Mike

1
我使用以下代码成功获取了正确的颜色: 小提示:代码中有一个小修正,可以忽略十六进制数的 alpha 位,这样我就可以得到完整的颜色而不是较少饱和度的颜色。
string colorizationValue = string.Format("{0:x}", Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", "ColorizationColor", "00000000"));
StringBuilder bl = new StringBuilder(colorizationValue);
bl[0] = 'd';
bl[1] = '9';
colorizationValue = bl.ToString();

BrushConverter bc = new BrushConverter();
Brush brush = (Brush)bc.ConvertFrom("#" + colorizationValue);
cvs_barColor.Background = brush;

0

我为这个链接创建了一个开源库,也可以在NuGet上使用。

install-package aerocolor-wpf.AeroColor

安装完包后,您可以引用DynamicResource,根据需要调用AeroColorAeroBrush

还需要一些设置代码,但不多。只需将以下内容放入窗口的Loaded事件处理程序中即可。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Loaded += MainWindow_Loaded;
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        AeroResourceInitializer.Initialize();
    }
}

这个库的好处在于它还安装了一个钩子,随着系统中实际的Aero颜色变化而更新这些资源。这意味着您也不必处理它,如果您使用DynamicResource来指向XAML中的颜色而不是StaticResource,WPF也会自动更新UI中的颜色。

当Windows 8过渡性地改变Aero颜色时,您的颜色跟随变化看起来非常酷。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接