WinForms - это старая технология, которая не была сильно обновлена для поддержки новых функций ОС. Нет хорошего способа получить цвет Accent с использованием базовых библиотек. Net (хотя существует взлом на основе реестра, использующий недокументированные ключи для получения значения). К счастью, вы можете получить доступ к некоторым Windows API времени выполнения, добавив пакет NUGET Microsoft. Windows .SDK.Contracts .
После добавления этого пакета вы можете создать экземпляр класса Windows .UI.ViewManagement.UISettings , а затем использовать метод UISettings.GetColorValue (UIColorType) для получения значения.
Чтобы получать уведомления об изменениях значения, вы можете подписаться на SystemEvents.UserPreferenceChanged Event . Это событие классифицирует изменение как изменение типа UserPreferenceCategory.General , которое используется по умолчанию, когда старый лог c не знает, что изменилось (снова старый код не обновляется для новых функций). Вы можете обнаружить изменения с помощью listenimg для сообщения WM_SETTINGCHANGE и проверить, когда WParam имеет значение NULL, а LParam указывает на строку («ImmersiveColorSet»), но это отвечает на значение строки, которое никогда не меняется и не сильно лучше, чем реагировать на все изменения UserPreferenceCategory.General.
С учетом всего этого простая реализация будет выглядеть следующим образом:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
UserPreferenceChangedEventHandler UserPerferenceChanged = (s, e) =>
{ if (e.Category == UserPreferenceCategory.General || e.Category == UserPreferenceCategory.VisualStyle) BackColor = GetAccentColor(); };
SystemEvents.UserPreferenceChanged += UserPerferenceChanged;
Disposed += (object s, EventArgs e) => { SystemEvents.UserPreferenceChanged -= UserPerferenceChanged; };
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
BackColor = GetAccentColor();
}
static Windows.UI.ViewManagement.UISettings uiSettings = new Windows.UI.ViewManagement.UISettings();
private static System.Drawing.Color GetAccentColor()
{
Windows.UI.Color c = uiSettings.GetColorValue(Windows.UI.ViewManagement.UIColorType.Accent);
return Color.FromArgb(c.A, c.R, c.G, c.B);
}
}