1

開発したプラグインでマウスイベントを取得するためのフック設定があります。を取得する必要がありWM_LBUTTONDBLCLK、メッセージフローは次のようになると思います。

WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK

最初のフックを処理するときに次のフックを呼び出すとWM_LBUTTONDOWN、フローは期待どおりです。ただし、自分の結果を返すと、予想されるダブルクリックはマウスダウンメッセージとして表示されます。なぜこれが起こっているのか考えていますか?メッセージを処理した後で停止し、次のフックに渡さないようにする必要があります。

4

2 に答える 2

2

MSDNで少し読んだ後、この動作の説明はWM_LBUTTONDBLCLKページの次のコメントにあると思います。

CS_DBLCLKS このスタイルのウィンドウのみがメッセージを受信できWM_LBUTTONDBLCLK ます。メッセージは、ユーザーがシステムのダブルクリック制限時間内にユーザーがマウスの左ボタンを押し、離し、もう一度押すたびに生成されます。

WM_LBUTTONDOWNプログラムがまたはを処理するときにゼロ以外の値を返す場合、WM_LBUTTONUPそれらのメッセージはターゲットウィンドウに送信されません-期待どおりです。ただし、上記の引用に基づく私の推論では、スタイルのあるウィンドウはメッセージを受信して​​いないCS_DBLCLKSため(フックはウィンドウがメッセージを受信できないため)、システムはメッセージを生成する必要があるとは感じません。。WM_LBUTTONDBLCLK

言い換えると、システムは、(a)ウィンドウが前の/メッセージを受信し、(b)そのウィンドウがスタイルを持っているWM_LBUTTONDBLCLK 場合にのみ生成します。フックは条件(a)が満たされないようにするため、生成されることはなく、代わりにメッセージが送信されます。WM_LBUTTONDOWNWM_LBUTTONUPCS_DBLCLKSWM_LBUTTONDBLCLKWM_LBUTTONDOWN

回避策に関しては、完璧な解決策があるとは思えません。メッセージを受信したい理由は、通常のメッセージがダブルクリックの2回目のクリックを表してWM_LBUTTONDBLCLKいるかどうかをフックが認識できるようにするためだと思います。WM_LBUTTONDOWNその場合、Faisalが提案するようにレジストリからダブルクリック時間を読み取り、フックにWM_LBUTTONDOWNメッセージ間の時間を測定させることができますが、不正確な結果が得られる可能性が高くなります(送信されるメッセージ)。あるいは、代わりにWM_LBUTTONDOWN/WM_LBUTTONUPメッセージをフックが所有する非表示のウィンドウ(CS_DBLCLKSスタイルを持つ)にリダイレクトできる方法がある場合、システムは最終的にWM_LBUTTONDBLCLKメッセージを送信して非表示のウィンドウに送信し、そのウィンドウで処理できますWndProc(ただし、フックの経験があまりないため、これが可能かどうかはわかりません)。

于 2009-09-22T20:46:23.243 に答える
0

独自の結果を返す前にCallNextHookEx()を呼び出していますか?MSDNのドキュメントMouseProcによると、独自の結果を返すときに他のフックが呼び出されないようにするため、呼び出すことを強くお勧めします。

低レベルのマウスフックの使用を検討しましたか?フックされているプロセスにDLLを挿入する必要はなく、より一貫性のある強力なフックであることがわかります(適切にコーディングされていない場合はリソースを大量に消費しますが)-特に一部のレガシーアプリケーションでクリックをリッスンする場合(古代のデルファイでコーディングされたもの)とターミナルサーバー(citrix)を介して提供されるアプリケーションのクリック。低レベルのマウスフックの唯一の問題は、それ自体がダブルクリックを受け取らないことです。つまり、レジストリに「DoubleClickSpeed」を照会し、その間隔内で2つのマウスダウンイベントをチェックしてから、ダブルクリックをトリガーする必要があります。

于 2009-09-22T04:25:15.723 に答える