3

次のプロジェクトを使用して、C# アプリケーションでグローバルなキーボードとマウスのフックを処理しています。

このプロジェクトは基本的に、WH_MOUSE_LL または WH_KEYBOARD_LL 定数を使用した Win API 呼び出し SetWindowsHookEx のラッパーです。また、特定の状態を管理し、通常、この種のフッキングをかなり簡単にします。

私が取り組んでいるマウスジェスチャー認識ソフトウェアにこれを使用しています。基本的には、グローバル ホットキー (CTRL など) が押されたことを検出し、ユーザーが定義済みのジェスチャの形でマウスを動かしてから、グローバル ホットキーを離すようにセットアップしました。

KeyDown のイベントが処理され、プログラムが KeyUp イベントを受け取るまでマウスの位置の記録を開始するように指示します。これは正常に機能しており、ユーザーがマウス ジェスチャ モードに簡単に入ることができます。KeyUp イベントが発生し、適切なジェスチャが検出されると、ユーザーが描画した特定のジェスチャに対して定義したアクティブ ウィンドウに特定のキーストロークが送信されると想定されます。

SendKeys.Send/SendWait メソッドを使用して、出力を現在のウィンドウに送信しています。

私の問題は次のとおりです。ユーザーがグローバル ホットキー (CTRL など) を離すと、KeyUp イベントが発生します。私のプログラムは、記録されたマウス ポイントを取得し、関連するジェスチャを検出し、SendKeys を介して正しい入力を送信しようとします。

ただし、これはすべて KeyUp イベントにあるため、そのグローバル ホットキーの処理は完了していません。したがって、たとえば、検出されたときにキー「A」を送信するジェスチャを定義し、グローバル ホットキーが CTRL である場合、検出されたときに SendKeys は「A」を送信しますが、CTRL はまだ「ダウン」しています。つまり、単に A を送信する代わりに、CTRL-A を取得しています。したがって、この例では、単一の文字「A」を物理的に送信する代わりに、CTRL-A ショートカットを使用してすべてを選択しています。ユーザーが CTRL (グローバル ホットキー) を離しても、システムはまだダウンしていると見なしています。

KeyUp イベントが発生したら、グローバル ホットキーがシステムによって登録されなくなり、SendKeys を介して正しい入力が送信されるように、プログラムを一定時間または特定のイベントの間待機させるにはどうすればよいでしょうか?

4

1 に答える 1

3

タイマーを設定して、ほんの一瞬後(たとえば、100ミリ秒)にSendKeysを起動するだけで、ユーザーはわずかな遅延に気付くことはありませんが、KeyUpのイベントハンドラーの外部で発生するだけで十分です。

もう1つの方法は、(を使用してPostMessage)独自のウィンドウを投稿して、効果を「トリガー」することになっているときにシグナルを送信し、そのカスタムメッセージハンドラーで実際にSendKeysを実行することです。これには、任意の「遅延」を使用しないという利点があります。ただし、設定は少し複雑です(特に、.NETでは、動作させるためにさらにいくつかのAPI呼び出しを呼び出したり、WndProc関数をオーバーライドしたりする必要があります...

于 2010-05-03T00:25:56.473 に答える