在WPF中检测系统主题更改 c# .net winapi dwm
我完全不知道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。
- 上一篇:内容分发网络 CDN
- 下一篇:C#响应Windows系统主题颜色变化
评论列表