次のようなグローバルマウスフック関数をインストールしました。
mouseEventHook = ::SetWindowsHookEx( WH_MOUSE_LL, mouseEventHookFn, thisModule, 0 );
フック関数は次のようになります。
RESULT CALLBACK mouseEventHookFn( int code, WPARAM wParam, LPARAM lParam )
{
if ( code == HC_ACTION ) {
PMSLLHOOKSTRUCT mi = (PMSLLHOOKSTRUCT)lParam;
// .. do interesting stuff ..
}
return ::CallNextHookEx( mouseEventHook, code, wParam, lParam );
}
さて、私の問題は、「面白いことをする」部分にかかる時間を正確に制御できないことです。特に、Windowsレジストリで定義されているLowLevelHooksTimeoutよりも時間がかかる場合があります。これは、少なくともWindows XPでは、システムがマウスイベントをフック機能に配信しなくなったことを意味します。これを避けたいのですが、同時に、ターゲットGUIがイベントを受信する前に、「面白いことをする」部分を実行する必要があります。
mouseEventHookFn
上記がワーカースレッドにメッセージを投稿してすぐに実行できるように、別のスレッドで「興味深いもの」の作業を行うことでこれを解決しようとしましたreturn 1;
(これによりフック機能は終了しますが、イベントがGUIに渡されることはありません) )。アイデアは、ワーカースレッドが終了すると、CallNextHookEx
呼び出し自体を実行するというものでした。
ただし、これにより内部でCallNextHookEx
クラッシュが発生します(実際、クラッシュはという内部関数の内部で発生します。フック関数の外部PhkNextValid
から呼び出すのは安全ではないと思いますが、これは本当ですか?CallNextHookEx
もしそうなら、GUIがイベントを受信する前にコード(アプリケーションのGUIスレッドと対話する必要がある)を実行し、フック関数が長時間ブロックされないようにする方法を他の誰かが知っていますか?