2013-05-30 4 views
3

У меня есть программа без окон, которая обрабатывает горячие клавиши управления окнами. Я хотел бы предоставить такие функции, как возможность перемещения окна между мониторами. Я использовал 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, когда они запускают огонь, так как они не привязаны к окну, которые будут обрабатываться основным потоком.

+2

Регистрация для сообщений об изменении устройства: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363432(v=vs.85).aspx –

+0

Я видел, что, когда я смотрел, должен передать это фактическое HWND или он примет NULL и опубликует сообщения в поток? – Wug

+1

Похоже, что может потребоваться ручка окна. Когда я это сделал, я использовал скрытое окно. Поэтому вам, вероятно, придется создать окно, изменить цикл сообщений на «GetMessage, TranslateMessage, DispatchMessage», а затем обработать WM_DEVICECHANGE в вашей функции WinProc. –

ответ

7

Вы должны создать окно, чтобы получить сообщение WM_DEVICECHANGE.

WM_DEVICECHANGE - это сообщение, которое транслируется, SendMessage(HWND_BROADCAST,...) style. Это могут получить только окна верхнего уровня. Окно не должно быть видимым, поэтому нет причин искать альтернативу.

RegisterDeviceNotification() является альтернативой. Но это все еще нуждается в окне. Или служебный дескриптор, но вы не хотите перемещать окна из службы. Они работают в изолированном сеансе со своим рабочим столом. Так что создание окна является жестким требованием.