К сожалению, принятое решение не работает с изменениями цветовой темы Aero, и шестнадцатеричные числа сообщений WM перепутаны - но я согласен, что это очень полезно, если вы хотите перехватывать сообщения WM в WPF.Некоторое время я пытался найти решение этой проблемы, и я думаю, что он нашел решение для всех возможных случаев (для аэро и классических тем).
Изменение цвета Aero вызывает WM_DWMCOLORIZATIONCOLORCHANGEDmessage.
Чтобы определить, когда меняется цветовая тема, вы должны использовать несколько методов.Событие Form.StyleChanged обнаружит все изменения темы, за исключением изменений цвета Aero .Вот альтернативное решение для StyleChanged.(Хорошо, я знаю, что это WinForms, но у вас есть идея. В любом случае эквивалент WPF находится в принятом ответе.)
private const int WM_DWMCOLORIZATIONCOLORCHANGED = 0x320;
private const int WM_DWMCOMPOSITIONCHANGED = 0x31E;
private const int WM_THEMECHANGED = 0x031A;
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_DWMCOLORIZATIONCOLORCHANGED:
case WM_DWMCOMPOSITIONCHANGED:
case WM_THEMECHANGED:
// you code here
break;
default:
break;
}
base.WndProc(ref m);
}
Для цветовых тем Aero событие SystemEvents.UserPreferenceChanged также работает (спасибо, видит!):
Microsoft.Win32.SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
private void SystemEvents_UserPreferenceChanged(object sender, Microsoft.Win32.UserPreferenceChangedEventArgs e)
{
if (e.Category == Microsoft.Win32.UserPreferenceCategory.General)
{
// your code here, compare saved theme color with current one
}
}
Как вы можете видеть выше, это далеко не интуитивно понятно.Изменение цвета Aero запускает «Общее» событие изменения предпочтения, хотя для этого есть много более подходящих, например, «VisualStyle» и т. Д. *
Если вы хотите быть тщательным, вы должны сравнить сохраненныеЦвет DWM к текущему цвету DWM, чтобы убедиться, что это действительно цветовая тема Aero, которая вызвала это событие (с помощью вызова API DwmGetColorizationParameters), а не что-то еще.Посмотрите эти ответы о том, как можно получить цвета Aero: Получить активный цвет автоматической цветовой темы Windows 8