ウィンドウフックの仕組みと利用方法

注意: システム全体に影響するフックを設定する場合、フック関数はDLL内に配置する必要があります。
SetWindowsHookEx(
  idHook: Integer;     {フックの種類}
  lpfn: TFNHookProc;   {関数ポインタ}
  hmod: HINST;         {フック関数を含むモジュールのハンドル (EXEまたはDLL); 通常はHInstanceを使用; 現在のスレッドの場合は0も可能}
  dwThreadId: DWORD    {関連するスレッド; GetCurrentThreadIdで現在のスレッドを取得可能; 0はシステム全体のフックを意味}
): HHOOK;              {フックのハンドルを返す; 0は失敗を示す}

// フックの種類 idHook の選択肢:
WH_MSGFILTER       = -1; {スレッドレベル; ユーザーとコントロール間のメッセージを捕捉}
WH_JOURNALRECORD   = 0;  {システムレベル; メッセージキューから出力されるすべての入力メッセージを記録し、キューから削除される際に発生; マクロ記録に使用}
WH_JOURNALPLAYBACK = 1;  {システムレベル; WH_JOURNALRECORDで記録されたメッセージを再生し、メッセージを再びメッセージキューに送信}
WH_KEYBOARD        = 2;  {システムレベルまたはスレッドレベル; キーボードメッセージを捕捉}
WH_GETMESSAGE      = 3;  {システムレベルまたはスレッドレベル; メッセージキューから取り出されるメッセージを捕捉}
WH_CALLWNDPROC     = 4;  {システムレベルまたはスレッドレベル; ターゲットウィンドウに送信されるメッセージを捕捉、SendMessage呼び出し時に発生}
WH_CBT             = 5;  {システムレベルまたはスレッドレベル; システム基本メッセージを捕捉、例えばウィンドウ作成、アクティブ化、閉鎖、最大化・最小化、移動など}
WH_SYSMSGFILTER    = 6;  {システムレベル; システム全体でのユーザーとコントロールのインタラクションメッセージを捕捉}
WH_MOUSE           = 7;  {システムレベルまたはスレッドレベル; マウスメッセージを捕捉}
WH_HARDWARE        = 8;  {システムレベルまたはスレッドレベル; 標準以外のハードウェア(マウスやキーボード以外)からのメッセージを捕捉}
WH_DEBUG           = 9;  {システムレベルまたはスレッドレベル; 他のフックが呼び出される前に呼び出され、フックのデバッグに使用}
WH_SHELL           = 10; {システムレベルまたはスレッドレベル; シェルアプリケーションに送られるメッセージを捕捉}
WH_FOREGROUNDIDLE  = 11; {システムレベルまたはスレッドレベル; アプリケーションのフォアグラウンドスレッドがアイドル状態になったときに呼び出される}
WH_CALLWNDPROCRET  = 12; {システムレベルまたはスレッドレベル; ターゲットウィンドウが処理したメッセージを捕捉、SendMessage呼び出し後に発生}
UnhookWindowsHookEx - フックの解除 ==========================
UnhookWindowsHookEx(
  hhk: HHOOK {フックのハンドル}
): BOOL;     {成功:true、失敗:false}
CallNextHookEx - 次のフックを呼び出す ========================
CallNextHookEx(
  hhk: HHOOK;        {現在のフックのハンドル}
  nCode: Integer;    {フックコード; 次のフックに渡す情報}
  wParam: WPARAM;    {渡すパラメータ; フックの種類によって内容が異なる}
  lParam: LPARAM     {渡すパラメータ; フックの種類によって内容が異なる}
): LRESULT;         {次のフック実行後の戻り値を返す; 0は失敗を示す}

// パラメータ nCode のオプション値:
HC_ACTION        = 0;   {}
HC_GETNEXT       = 1;   {}
HC_SKIP          = 2;   {}
HC_NOREMOVE      = 3;   {}
HC_NOREM         = HC_NOREMOVE; {}
HC_SYSMODALON    = 4;   {}
HC_SYSMODALOFF   = 5;   {}

タグ: Windows API フック システムプログラミング メッセージ処理 DLL

6月12日 17:38 投稿