Notification/subscription 方法 Windows 10 次主题更改
Notification/subscription method for Windows 10 theme change
正如 yolu 可能已经注意到的,MS 在 Windows 10 中引入了一种现代类型的 'theming',涉及开始菜单和任务栏等基本 OS 元素。对于较新的版本,您可以选择 'light' 主题来替代默认的黑色主题。
我想知道是否有一个 API 或挂钩可以优雅且(更重要的是)有效地实时检查主题更改(在 MS 文档中没有找到与此相关的任何内容,但这些宝石通常足够恕我直言)。
具体问题:当您的桌面应用程序带有系统托盘图标时,很可能是您将其设计为明亮的。几乎所有现代 Windows 图标都具有这种风格(简单和白色,在黑色任务栏上产生良好的可读性)。现在您可以为浅色主题提供不同版本的深色风格,但如何注意何时应用它?
我知道 HCU (Software/Microsoft/Windows/CurrentVersion/Themes/Personalize) 下的注册表项,这是我现在正在使用的。然而,盲目地每 x 毫秒检查一次更改似乎很尴尬。
如果没有这样的东西可用,我也很高兴听到一些关于更有效地实施这种检查的想法。
方法一:使用RegNotifyChangeKeyValue
Notifies the caller about changes to the attributes or contents of a
specified registry key.
方法二:使用WM_SETTINGCHANGE
Applications should send WM_SETTINGCHANGE to all top-level windows when they make changes to system parameters. (This message cannot be sent directly to a window.) To send the WM_SETTINGCHANGE message to all top-level windows, use the SendMessageTimeout function with the hwnd parameter set to HWND_BROADCAST.
我倾向于使用第二种方法,我已经尝试过,并且能够成功。
最小代码示例:
case WM_SETTINGCHANGE:
{
if (!lstrcmp(LPCTSTR(lParam), L"ImmersiveColorSet"))
{
//theme has been changed
}
}
正如 yolu 可能已经注意到的,MS 在 Windows 10 中引入了一种现代类型的 'theming',涉及开始菜单和任务栏等基本 OS 元素。对于较新的版本,您可以选择 'light' 主题来替代默认的黑色主题。
我想知道是否有一个 API 或挂钩可以优雅且(更重要的是)有效地实时检查主题更改(在 MS 文档中没有找到与此相关的任何内容,但这些宝石通常足够恕我直言)。
具体问题:当您的桌面应用程序带有系统托盘图标时,很可能是您将其设计为明亮的。几乎所有现代 Windows 图标都具有这种风格(简单和白色,在黑色任务栏上产生良好的可读性)。现在您可以为浅色主题提供不同版本的深色风格,但如何注意何时应用它?
我知道 HCU (Software/Microsoft/Windows/CurrentVersion/Themes/Personalize) 下的注册表项,这是我现在正在使用的。然而,盲目地每 x 毫秒检查一次更改似乎很尴尬。
如果没有这样的东西可用,我也很高兴听到一些关于更有效地实施这种检查的想法。
方法一:使用RegNotifyChangeKeyValue
Notifies the caller about changes to the attributes or contents of a specified registry key.
方法二:使用WM_SETTINGCHANGE
Applications should send WM_SETTINGCHANGE to all top-level windows when they make changes to system parameters. (This message cannot be sent directly to a window.) To send the WM_SETTINGCHANGE message to all top-level windows, use the SendMessageTimeout function with the hwnd parameter set to HWND_BROADCAST.
我倾向于使用第二种方法,我已经尝试过,并且能够成功。
最小代码示例:
case WM_SETTINGCHANGE:
{
if (!lstrcmp(LPCTSTR(lParam), L"ImmersiveColorSet"))
{
//theme has been changed
}
}