我有一个处理一些窗口管理热键的无窗口程序。我想提供诸如在监视器之间移动窗口的功能。我曾经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
它们触发时,因为它们没有绑定到窗口,由主线程处理。