簡體   English   中英

如何檢測新監視器的添加?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM