[英]How do I detect the addition of a new monitor?
我有一個無窗口程序來處理一些窗口管理熱鍵。 我想提供諸如在監視器之間移動窗口的功能。 我已經使用EnumDisplayMonitors
來枚舉系統中所有現有的監視器,並且我編寫了代碼來處理WM_DEVICECHANGE
,但我實際上並沒有收到消息。
這是我的消息循環:
// I've tried GetMessage(&msg, (HWND) NULL, 0, 0) here too
while (GetMessage(&msg, (HWND) -1, 0, 0) > 0)
{
int key;
int mod;
MessageBox(NULL, (LPCWSTR) ((std::wostringstream&) (std::wostringstream() << L"You got a message: " << msg.message)).str().c_str(), L"Got Message", MB_OK);
switch (msg.message)
{
case WM_HOTKEY:
key = HIWORD(msg.lParam);
mod = LOWORD(msg.lParam);
if (mod != MOD_WIN) continue;
ProcessHotkey(key);
break;
case WM_DEVICECHANGE:
InitMonitorInfo();
}
}
該程序編譯並運行正常,熱鍵工作。 添加或刪除監視器后,沒有任何反應。 指示已收到消息的消息框從未出現。
我想我可以每隔5秒輪詢顯示器配置,但這不是解決問題的正確方法。
我是否需要實際創建一個窗口來接收WM_DEVICECHANGE
? 因為我沒有。 熱鍵在觸發時將其消息發布為NULL
,因為它們未綁定到窗口,由主線程處理。
您必須創建一個窗口來獲取WM_DEVICECHANGE
消息。
WM_DEVICECHANGE
是廣播的消息, SendMessage(HWND_BROADCAST,...)
樣式。 只有頂級窗口才能接收它。 窗口不需要是可見的,因此沒有理由尋找替代方案。
RegisterDeviceNotification()
是另一種選擇。 但那仍然需要一個窗口。 或服務句柄,但您不希望從服務移動窗口。 它們與自己的桌面在一個獨立的會話中運行。 所以創建一個窗口是一個很難的要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.