在主题更改 Win32 应用程序上接收WM_SETTINGCHANGE而不是WM_THEMECHANGED消息

Roy Li - MSFT 33,356 信誉分 Microsoft 供应商
2024-07-11T03:13:25.5433333+00:00

我在 Windows 11 上运行 Win32 应用程序。我想捕获主题更改事件,但是当系统主题更改时WM_THEMECHANGED我收到WM_SETTINGCHANGE而不是消息(从设置)。

找到下面的示例代码片段,了解我如何处理消息。

LRESULT CALLBACK WindowProc(HWND hWnd, UINT messageCode, WPARAM wParam, LPARAM lParam)
{
    switch (messageCode)
    {
    case WM_SETTINGCHANGE:

        break;

    case WM_THEMECHANGED: {
        break;
    }

    default:
        return DefWindowProc(hWnd, messageCode, wParam, lParam);
    }
    return 0;
}

如果我在这里遗漏了任何内容,请纠正我。或者,如果有任何方法可以从WM_SETTINGCHANGE中识别主题更改事件。

而且,当我从设置中更改系统主题时,我观察到WM_SETTINGCHANGE被调用的次数很少(2-12 次,具体取决于上一个主题和新主题)。

此问题由:https://learn.microsoft.com/en-us/answers/questions/1683689/receiving-wm-settingchange-instead-of-wm-themechan总结而来

Windows API - Win32
Windows API - Win32
一组适用于桌面和服务器应用程序的核心 Windows 应用程序编程接口 (API)。 以前称为 Win32 API。
104 个问题
0 个注释 无注释
{count} 票

1 个答案

排序依据: 非常有帮助
  1. Tong Xu - MSFT 2,461 信誉分 Microsoft 供应商
    2024-07-12T03:26:51.6633333+00:00

    你好,

    欢迎来到 Microsoft Q&A!

    WM_SETTINGCHANGE消息:当应用程序更改系统参数时,应将WM_SETTINGCHANGE发送到所有顶级窗口。当 SystemParametersInfo 函数更改系统范围的设置或策略设置发生更改时,发送到所有顶级窗口的消息。

    WM_THEMECHANGED消息:在主题更改事件之后广播到每个窗口。在 SetWindowTheme 调用结束时,将向窗口发送一条WM_THEMECHANGED消息。

    就我而言,当您从设置中更改系统主题时,您将收到WM_SETTINGCHANGE消息。

    当我从设置中更改系统主题时,我观察到WM_SETTINGCHANGE被调用了几次

    “设置”应用使用 SendMessageTimeout 广播WM_SETTINGSCHANGE消息,该消息将WM_SETTINGCHANGE消息发送到所有顶级窗口。在每个窗口超时之前,该函数不会返回。因此,总等待时间最多可以等于 uTimeout 的值乘以顶级窗口的数量。因此,您可能会收到多条消息。

    我建议你可以参考这个线程:

    https://stackoverflow.com/questions/76168381/wm-settingschange-is-received-twice-when-changing-preference-to-dark-mode


    如果答案是正确的解决方案,请单击“接受答案”并请投赞成票。如果您对此答案有其他疑问,请点击“评论”。

    注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知

    0 个注释无注释报告问题

    0 个注释 无注释

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。