我讀過的很多文章都是輪詢注冊表等等。C/C 沒有對應的通知事件可以獲取嗎?
uj5u.com熱心網友回復:
在 Win32 中,在您的主 UI 執行緒上有一個本地頂級視窗(可以隱藏),用于偵聽WM_SETTINGCHANGE和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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/407447.html
標籤:
下一篇:QT快速布局按百分比分割
