Windows関係‎ > ‎

イベントのフック

Windowsのイベント処理をフックすることで、キーボードやマウスの入力を監視したり、無効にしたりできます。

フックする

  • SetWindowsHookEx関数を使用する。
  • 関数定義は以下の通り。失敗時はNULL、成功するとフックハンドルを返す。
    HHOOK SetWindowsHookEx(
      int idHook,        // フックタイプ
      HOOKPROC lpfn,     // フックプロシージャ
      HINSTANCE hMod,    // アプリケーションインスタンスのハンドル
      DWORD dwThreadId   // スレッドの識別子
    );
  • 例えばキーボードイベントを監視する場合は第一引数に定数WH_KEYBOARD、若しくは定数WH_KEYBOARD_LLを指定する。
  • 行わせたい処理を記述した関数ポインタを第二引数に指定。
  • アプリケーションのインスタンスハンドルを第三引数に指定。
    • 通常アプリ内でのフックならNULL。
    • DLL内にフックプロシージャを置く場合はDLLのインスタンスを指定。
  • スレッドの識別子を第四引数を指定。
    • 通常アプリ内でのフックならGetCurrentThreadId()を指定する。
    • システムフックの場合はゼロを指定する。

ローカルフックとシステムフック

  • アプリ内に回ってくるイベントをフックする場合はローカルフックと言う。
  • Windowsのイベントをフックすることをシステムフック、あるいはグローバルフックと言う。
    • システムフックをする場合はDLL内にフックプロシージャを置く必要がある(DLLを使わないとSetWindowsHookEx関数で失敗する)。

フックプロシージャ

  • フックプロシージャは次のような戻り値、引数で作成する。
     LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
  • フックしたプロシージャでは処理後、特別な理由がない限り本来の処理へ引き継がなければならない。
    • そうしないとイベントは握りつぶされることになる。
  • 本来の処理へ引き継ぐには次のようにCallNextHookEx関数を用いる。

    return CallNextHookEx(hhook, nCode, wParam, lParam);

    • hhookはフックハンドル。
  • CallNextHookEx関数の戻り値ではなくゼロを返すと、メッセージがメッセージキューから削除される。
    • 代わりのメッセージを投げる場合などにゼロ戻り値を使用することになりそう。

フックを解除する

  • UnhookWindowsHookEx関数を用いる。
  • 関数定義は以下の通り。成功すれば0以外の整数値を返す。
    BOOL UnhookWindowsHookEx(
      HHOOK hhk   // 削除対象のフックプロシージャのハンドル
    );
    • 引数にはフック時に取得したフックハンドルを与える。

参考リンク

 
 
Comments