私はフックといくつかのことをしようとしてきた、とフックがメッセージキューを使用しなければならない理由を私は理解していないと使用することは、SetWindowsHookExなければならないのはなぜは、Windowsメッセージキュー
hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);
はなぜ何かをしませんこの作品のように?
hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, 0);
cin >> aKey;
UnhookWindowsHookEx(hook);
ブーストスレッドを使用するとバリアが機能しません。フックとアンフックの間の待ち合わせが別のやり方でできないのはなぜですか?
EDIT:
実行するループも
(私はそれが大きな違いを作るとは思わない)、決して私はこのサンプルを作成したとき、私は、ミスをしなかった私はWH_KEYBOARD_LLフックを作成し、WH_KEYBOARDありませんGetMessage関数でのみ待機します。
ループは、終了メッセージPostThreadMessage(id, WM_QUIT, 2323, NULL);
を送信したときにのみ実行されるため、待機する側で何が行われるのか理解できません。内部処理がありますか?
RELATED:
C++ SetWindowsHookEx WH_KEYBOARD_LL Correct Setup
How can I set up a CBT hook on a Win32 console window?
これを正しく理解すれば、WindowsはGet/PeekMessage()コール中にしかコールバックを呼び出せません。 – Ha11owed
正しく理解しています。コールをスレッドに安全に挿入する方法は他にありません。アイドル状態にする必要があります。これがメッセージループが存在する理由です。 –
@HansPassantを明確にするには、WH_KEYBOARDという名前のパイプのようなグローバルフックを使って自分のプログラムに情報を渡して、そのプログラムがメッセージポンプを必要としないことを示唆していますか? – dave