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;
}
我看的很多文章都是轮询注册表之类的。 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;
}