C#でWindows APIを叩いてマウスとキーボードの操作を検出する方法を紹介する。
これができたら、アプリのウィンドウ内の操作に限らず、別アプリやデスクトップ上のマウス/キーボード操作を検出したり、履歴として残しておいたりできるようになる。
使うAPIは次の通り。
- SetWindowsHookEx
- UnhookWindowsHookEx
- CallNextHookEx
- GetModuleHandle
- GetCursorPos
マウスポインタを移動させる方法を紹介する記事で説明したようにビルドの警告を回避するために次のようにNativeMethodsクラスをつくり、その中でこれらAPIを読み込む。
APIの利用に必要な構造体やデリゲートの定義も含まれるので記述量がそれなりにあるけど、あくまで使うAPIは上で列挙したものである。
そしてこのNativeMethodsクラスを使ってマウスとキーボードの操作を検出する。
大まかにいうと、次のような作り方になる。
- マウスの何らかの操作が発生したときに実行したい処理をメソッドとしてつくる。
- キーボードの何らかの操作が発生したときに実行したい処理をメソッドとしてつくる。
- 1と2でつくったメソッドをそれぞれ専用の形式のデリゲートから参照する。
- Windows APIを通じて、デリゲートをマウスやキーボードのイベントに紐づける。
まず、手順1,2でつくるメソッドは、手順3のデリゲートの形式に則る必要がある。
マウスならLowLevelMouseProc、キーボードならLowLevelKeyboardProcだ。
実はどちらも同じ型の入出力なので、開発に支障がなければ1つのデリゲートの定義にまとめてしまってもよいかも知れない。
上で定義したNativeMethodsクラスではLowLevelMouseKeyboardProcという1つのデリゲートにまとめているけれど、参考程度に捉えてほしい。
マウスイベントに対応して実行するメソッドの定義は例えば次のようにできる。
キーボードイベントに対応して実行するメソッドの定義は例えば次のようにできる。
次に手順3。メソッドをデリゲートから参照する。ここでは自作したデリゲート型LowLevelMouseKeyboardProcを使う。「メソッドを識別するID」は手順4で必要になる。
最後に手順4。デリゲートをマウスやキーボードのイベントに紐づける。(フックという)
紐付けたものは、クラスのデストラクタやDisposeメソッドなどで「元の状態」に戻しておく必要がある。(アンフックという)
以上の作り込みで、マウスとキーボードの操作が検出できる。
もしも検出したタイミングやイベント発生の間隔を記録したい場合には、QueryPerformanceFrequencyクラスが有用なので、参考にするよい。
関連ページ:マウス・キーボード操作の自動化機能をつくろう