ブログ・コラム

2019年06月

2019.06.05

【C#】キーボードフック

Windowsシステムは、メッセージキューにメッセージが蓄積され、メッセージループによってイベントが処理されていきます。

キーボードが押された、離されたイベントをwindowが非アクティブ状態で取得する必要がある場合は、キーボードイベントをフックする必要があります。

以下にサンプルソースを掲載します。

サンプルソース

namespaceなどは適宜読み替えてください。

イベントをフックする場合は、DLL(user32.dll)にあるSetWindowsHookEx関数を使用して指定します。

この関数の引数の意味は下記のとおりです。

第1引数 フックするイベントの種類

キーボードのイベントをフックする場合は、
WH_KEYBOARD_LL(13)を指定する。

第2引数 フック時の関数のアドレス イベントが発生した時に実行される関数。
第3引数 インスタンスハンドル 現在実行中のハンドルを渡す。
第4引数 スレッドID 0を指定すると、すべてのスレッドでフックされる。

サンプルソースのように指定すると、キーが押される/離される毎にEventKey関数が呼ばれるようになります。

サンプルでは、キーが離された時にコンソールへコメントを表示し、処理をするようにしています。

最後にCallNextHookEx関数を実行していますが、これは次のフックプロシージャ―へ渡すために実行しています。もしここで終了する場合は0を返すようにします。

このサンプルは、下記のように実行すると、キーが離される毎にKeyEvent関数が実行されます。

※このサンプルソースに対するいかなる損害に対して、当方は一切の責任を負いかねます。
自己責任でお願いします。