Получить цвет окна Aero

Я сделал довольно приятный интерфейс для Windows 8, используя WPF. Это уже получается лучше, чем я мог пожелать, но мне было интересно следующее:

Можно ли каким-то образом получить текущий цвет окна, заданный пользователем? Знаете, вы можете установить цвет Aero, щелкнув правой кнопкой мыши по рабочему столу... Я планирую использовать этот цвет для пары элементов canvas в моем графическом интерфейсе.

Заранее спасибо!

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"));
}

Класс SystemColours существует именно для этой цели. Вы можете привязать к нему напрямую так

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

Мне удалось получить правильный цвет, используя следующий код:Little sidenote: в нем есть небольшая поправка, чтобы игнорировать альфа-бит шестнадцатеричного числа, поэтому я получаю полный цвет, а не менее насыщенный.

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;

Я создал библиотеку с открытым исходным кодом для этого здесь, которая также доступна на NuGet.

install-package aerocolor-wpf.AeroColor

После установки пакета вы можете обратиться к DynamicResource называется AeroColor а также AeroBrush в зависимости от того, что вам нужно.

Там тоже есть какой-то код установки, но это не так уж и много. Просто положите что-нибудь в свой Loaded обработчик события окна, как показано ниже.

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

        Loaded += MainWindow_Loaded;
    }

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

Отличительной особенностью этой библиотеки является то, что она также устанавливает хук, который обновляет эти ресурсы по мере изменения фактического цвета Aero в системе. Это означает, что вы не должны справляться с этим, и если вы используете DynamicResource указать на цвет в вашем XAML вместо StaticResourceWPF автоматически обновит цвет в вашем интерфейсе.

Выглядит очень круто, когда Windows 8 меняет цвет Aero переходно и ваш цвет следует.

Другие вопросы по тегам