Qt或Win32获取Windows或其他系统的通知事件,用户手动切换dark/light模式?

Qt or Win32 to obtain notification events for Windows or other systems, users manually switch dark/light mode?

我看的很多文章都是轮询注册表之类的。 C/C++是不是没有对应的通知事件可以获取?

在 Win32 中,在主 UI 线程上有一个本机顶级 window(可以隐藏)侦听 WM_SETTINGCHANGE and WM_SYSCOLORCHANGE 消息。当您收到任一事件时,重新轮询屏幕分辨率和桌面颜色设置。

您要监控的不仅仅是亮模式和暗模式。还要注意用户是否启用了“高对比度”模式。

您可以从以下示例代码开始:


struct MyCallback
{
    void OnSettingChange()
    {
        // put your code here
        OutputDebugString(L"OnSettingsChange occurred\r\n");

    }
    void OnColorChange()
    {
        // put your code here
        OutputDebugString(L"OnColorChange occurred\r\n");
    }
};

LRESULT __stdcall HiddenWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    MyCallback* pCallback = (MyCallback*)GetWindowLongPtr(hWnd, GWLP_USERDATA);

    switch (uMsg)
    {
        case WM_CREATE:
        {
            CREATESTRUCT* pCreateData = (CREATESTRUCT*)lParam;
            SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG)(pCreateData->lpCreateParams));
            return 0;
        }

        case WM_PAINT:
        {
            PAINTSTRUCT ps = {};
            BeginPaint(hWnd, &ps);
            EndPaint(hWnd, &ps);
            return 0;
        }

        case WM_SETTINGCHANGE:
        {
            pCallback->OnSettingChange();
            return 0;
        }
        case WM_SYSCOLORCHANGE:
        {
            pCallback->OnColorChange();
            return 0;
        }
        default:
        {
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
        }
    }

    return 0;
}



HWND CreateHiddenWindow(HINSTANCE hInstance, MyCallback* pCallback)
{
    const wchar_t* CLASSNAME = L"Windows class: 4F98C893-A9E1-4AC4-8E60-68CC220510A7"; // replace with your unique name or guid
    WNDCLASSEXW wcex = {};
    wcex.cbSize = sizeof(wcex);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = HiddenWindowProc;
    wcex.lpszClassName = CLASSNAME; 
    wcex.hInstance = hInstance;
    RegisterClassEx(&wcex);

    HWND hWnd = CreateWindow(CLASSNAME, L"Hidden", 0, 0, 0, 0, 0, NULL, NULL, hInstance, pCallback);

    return hWnd;
}