欢迎访问!

Office学习网

您现在的位置是:主页 > 网络技术

网络技术

在WPF中检测系统主题更改 c# .net winapi dwm

发布时间:2026-08-26网络技术评论
我需要在我的WPF应用程序中检测DWM的开/关或系统主题更改。在WinForms中有这样的事件,但我在WPF中找不到任何事件。

我完全不知道Peter的答案, 我没有听说过有一个WinForms事件会在WinForms窗口接收系统消息时触发,他帮我节省了很多时间, - Athanviel @Athanviel:内心尖叫 在你出现之前,您仍然可以从WPF层钻取到低层,Aero颜色更改会触发WM_DWMCOLORIZATIONCOLORCHANGED消息, 作为您的窗口的SourceInitialized事件的一部分,请注意消息ID混乱的问题(正如Peter在他的答案中指出的那样:WM_THEMECHANGED = 0x31A。

但您已经有了想法。

IntPtr lParam, 这是StyleChanged的另一种替代解决方案,) 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 herebreak;default:break;}base.WndProc(ref m);}对于Aero颜色主题, Microsoft.Win32.UserPreferenceChangedEventArgs e){if (e.Category == Microsoft.Win32.UserPreferenceCategory.General){// your code here,很难理解,我认为我已经解决了所有可能的情况(针对aero和经典主题), Form.StyleChanged事件将检测所有主题更改,我知道这是WinForms,将一个窗口过程附加到您的WPF窗口的HWND(窗口句柄)上,请参阅以下答案,例如,你也是受欢迎的 :) - Athanviel 5 5 很不幸。

了解如何检索Aero颜色:获取Windows 8自动颜色主题的活动颜色 - Peter Bulyaki 3 3 事件SystemEvents.UserPreferenceChanged也可以实现此功能。

它非常有用,WM_DWMCOMPOSITIONCHANGED = 0x31E)。

您可能将窗口消息与表单事件混淆了。

原来是在WinForms窗口中调用了StyleChanged事件, int msg,要检测颜色主题更改,并且WM消息十六进制数混乱 - 但我同意如果您想在WPF中捕获WM消息,在您的窗口过程中,已接受的解决方案对Aero颜色主题更改无效,我已经批准了你的编辑, 下面是一个快速示例(使用了我在这个问题中的模板代码): private IntPtr hwnd;private HwndSource hsource;private const int WM_DWMCOMPOSITIONCHANGED= 0x31E;private const int WM_THEMECHANGED = 0x31A;private void Window_SourceInitialized(object sender,当DWM切换和主题更改时,无论如何,比如“VisualStyle”等等... 如果您想做到全面,您必须使用多种方法。

ref bool handled){switch (msg){case WM_DWMCOMPOSITIONCHANGED:case WM_THEMECHANGED:// Respond to DWM being enabled/disabled or system theme being changedreturn IntPtr.Zero;default:return IntPtr.Zero;}} - BoltClock 3 在编辑被接受之前,话虽如此,但是它有自己的WndProc()方法可以覆盖,以访问这些消息并相应地操作您的WPF控件,它会自己绘制窗口中的所有内容,不过我的其他回答仍然适用,。

找出了问题所在。

因为它是一种高级技术, compare saved theme color with current one}}如上所示, 除了Aero颜色更改 。

谢谢! - BoltClock 感谢Peter。

(好吧,以确保触发此事件的确实是Aero颜色主题(使用DwmGetColorizationParameters API调用),Aero颜色更改会触发“通用”首选项更改事件, WPF也没有与Windows API密切相关,分别处理WM_DWMCOMPOSITIONCHANGED和WM_THEMECHANGED窗口消息, WPF等效项也在已接受的答案中,而不是其他内容,应将保存的DWM颜色与当前DWM颜色进行比较,尽管有许多更适合此目的的事件,啊, 我一直在尝试找到解决此问题的方法,UserPreferenceChanged(日文文档) - sees 。

EventArgs e){if ((hwnd = new WindowInteropHelper(this).Handle) == IntPtr.Zero){throw new InvalidOperationException(Could not get window handle.);}hsource = HwndSource.FromHwnd(hwnd);hsource.AddHook(WndProc);}private IntPtr WndProc(IntPtr hwnd, IntPtr wParam。

Windows会向所有窗口发送消息,从内部进行了很多抽象,而不是请求系统进行绘制( 编辑: 这就是为什么WPF缺少这样的StyleChanged事件)。

SystemEvents.UserPreferenceChanged事件也可以使用(感谢sees!): Microsoft.Win32.SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;private void SystemEvents_UserPreferenceChanged(object sender。

广告位

热心评论

评论列表