いくつかのウィンドウ管理ホットキーを処理するウィンドウのないプログラムがあります。モニター間でウィンドウを移動する機能などの機能を提供したいと考えています。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
は、ウィンドウにバインドされていないため、起動時にメッセージを送信し、メイン スレッドによって処理されます。