<Return[S]><Top>

SetWindowsHookEx

Declare Function Api_SetWindowsHookEx& Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook&, ByVal lpfn&, ByVal hmod&, ByVal dwThreadId&)

Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long

アプリケーション定義のフックプロシージャをフックチェーン内にインストールする。フックプロシージャをインストールすると、特定のイベントタイプを監視できる。監視の対象になるイベントは、特定のスレッド、または呼び出し側スレッドと同じデスクトップ内のすべてのスレッドに関連付けられているものである。

パラメータ
idHook
    インストール対象のフックタイプを指定する。次の値のいずれかを指定する。

    値                                        

説明                                                                                                                                     

    WH_CALLWNDPROC

システムが目的のウィンドウプロシージャへ送信したメッセージを監視する 1 個のフックプロシージャをインストールする。

    WH_CALLWNDPROCRET

目的のウィンドウプロシージャが処理したばかりのメッセージを監視する 1 個のフックプロシージャをインストールする。

    WH_CBT

コンピュータを利用したトレーニング(CBT)アプリケーションに有用な通知を受け取る 1 個のフックプロシージャをインストールする。

    WH_DEBUG

ほかのフックプロシージャのデバッグに有用な 1 個のフックプロシージャをインストールする。

    WH_FOREGROUNDIDLE

アプリケーションのフォアグラウンドスレッドがアイドル状態になろうとしているときに呼び出される、1 個のフックプロシージャをインストールする。アイドル時に優先順位の低いタスクを実行する場合、このフックは役に立つ。

    WH_GETMESSAGE

メッセージキューへポストされたメッセージを監視する 1 個のフックプロシージャをインストールする。

    WH_JOURNALPLAYBACK

WH_JOURNALRECORD フックプロシージャが既に記録したメッセージをポストする 1 個のフックプロシージャをインストールする。

    WH_JOURNALRECORD

システムメッセージキューへポストされた入力メッセージを記録する 1 個のフックプロシージャをインストールする。マクロを記録する際に、このフックは役立つ。

    WH_KEYBOARD_LL

Windows NT/2000:低水準のキーボード入力イベントを監視する 1 個のフックプロシージャをインストールする。

    WH_MOUSE

マウスメッセージを監視する 1 個のフックプロシージャをインストールする。

    WH_MOUSE_LL

Windows NT/2000:低水準のマウス入力イベントを監視する 1 個のフックプロシージャをインストールする。

    WH_MSGFILTER

ダイアログボックス、メッセージボックス、メニュー、スクロールバーのいずれかへの入力イベントの結果として生成されたメッセージを監視する 1 個のフックプロシージャをインストールする。

    WH_SHELL

シェルアプリケーションにとって有用な通知を受け取る 1 個のフックプロシージャをインストールする。

    WH_SYSMSGFILTER

ダイアログボックス、メッセージボックス、メニュー、スクロールバーのいずれかへの入力イベントの結果として生成されたメッセージを監視する 1 個のフックプロシージャをインストールする。このフックプロシージャは、呼び出し側スレッドと同じデスクトップ内のすべてのアプリケーションを対象とするこれらのメッセージを監視する。

lpfn
    フックプロシージャへのポインタを指定する。dwThreadID パラメータで 0、またはほかのプロセスが作成したスレッドの識別子を指定した場

    合、lpfn パラメータで、ダイナミックリンクライブラリ(DLL)内に存在するフックプロシージャへのポインタを指定しなければならない。それ以外

    の場合、現在のプロセスに関連付けられているコード内に存在するフックプロシージャへのポインタを指定できる。
hMod
    lpfn パラメータが指すフックプロシージャを保持している DLL のハンドルを指定する。dwThreadId パラメータが、現在のプロセスが作成した

    スレッドを指定していて、フックプロシージャが現在のプロセスに関連付けられているコード内に存在する場合、hMod パラメータで NULL を

    指定しなければならない。
dwThreadId
    フックプロシージャを関連付けるべきスレッドの識別子を指定する。0 を指定すると、フックプロシージャは、呼び出し側スレッドと同じデスクトッ

    プ内で動作している既存のすべてのスレッドに関連付けられる。

戻り値
    関数が成功すると、フックプロシージャのハンドルが返る。
    関数が失敗すると、NULL が返る。拡張エラー情報を取得するには、 関数を使う。

解説
    hMod パラメータで NULL を指定し、dwThreadId パラメータで 0 またはほかのプロセスが作成したスレッドの識別子を指定すると、エラー

    が発生することがある。
    CallNextHookEx 関数を呼び出して次のフックプロシージャへのチェーンを確立するかどうかは自由であるが、この関数を呼び出すことを強く

    推奨する。CallNextHookEx 関数を呼び出さないと、フックをインストールしたほかのアプリケーションがフックの通知を受け取れず、誤動作

    する可能性がある。このような通知をほかのアプリケーションに絶対に知らせたくないと考える非常に強い理由がある場合を除き、通常は

    CallNextHookEx 関数を呼び出すべきである。
    アプリケーションを終了する前に、アプリケーションは UnhookWindowsHookEx 関数を呼び出して、フックに関連付けられたシステムリソー

    スを解放しなければならない。
    フックのスコープは、フックタイプによって異なる。いくつかのフックは、グローバルスコープでのみ設定できる。ほかのフックは、特定のスレッ

    ドをスコープとすることもできる。次の表は、各フックに適用できるスコープを示す。

    フック                                    

スコープ                          

    WH_CALLWNDPROC

スレッドまたはグローバル

    WH_CALLWNDPROCRET

スレッドまたはグローバル

    WH_CBT

スレッドまたはグローバル

    WH_DEBUG

スレッドまたはグローバル

    WH_FOREGROUNDIDLE

スレッドまたはグローバル

    WH_GETMESSAGE

スレッドまたはグローバル

    WH_JOURNALPLAYBACK

グローバルのみ

    WH_JOURNALRECORD

グローバルのみ

    WH_KEYBOARD

スレッドまたはグローバル

    WH_KEYBOARD_LL

グローバルのみ

    WH_MOUSE

スレッドまたはグローバル

    WH_MOUSE_LL

グローバルのみ

    WH_MSGFILTER

スレッドまたはグローバル

    WH_SHELL

スレッドまたはグローバル

    WH_SYSMSGFILTER

グローバルのみ

    指定されたフックタイプがスレッドとグローバルの両方をサポートしている場合、最初にスレッドフックが呼び出され、次にグローバルフックが呼

    び出される。
    グローバルフックは共有リソースであり、そのようなフックをインストールすると、呼び出し側スレッドと同じデスクトップ内のすべてのアプリケー

    ションに影響を与える。すべてのグローバルフック関数は、ダイナミックリンクライブラリ(DLL)内に存在していなければならない。グローバルフ

    ックは、特別な目的のアプリケーションでのみ、またはアプリケーションのデバッグの際に開発を支援する目的でのみ使うべきである。ライブ

    ラリでフックの必要がなくなった場合、そのフックに対応するフックプロシージャを削除するべきである。