У меня есть программа без окон, которая обрабатывает горячие клавиши управления окнами. Я хотел бы предоставить такие функции, как возможность перемещения окна между мониторами. Я использовал 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
, когда они запускают огонь, так как они не привязаны к окну, которые будут обрабатываться основным потоком.
Регистрация для сообщений об изменении устройства: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363432(v=vs.85).aspx –
Я видел, что, когда я смотрел, должен передать это фактическое HWND или он примет NULL и опубликует сообщения в поток? – Wug
Похоже, что может потребоваться ручка окна. Когда я это сделал, я использовал скрытое окно. Поэтому вам, вероятно, придется создать окно, изменить цикл сообщений на «GetMessage, TranslateMessage, DispatchMessage», а затем обработать WM_DEVICECHANGE в вашей функции WinProc. –