SetWindowsHookEx
ここに掲載されている内容は、コンテンツ提供時の情報で、以前は有効であったリンクやURLが現在無効になっている場合や、技術情報が最新の情報と異なる場合がありますのでご了承ください。最新の情報については、Platform SDK: Interprocess Communications (英語)または、http://msdn.microsoft.com/library/en-us/ipc/base/interprocess_communications.asp をご覧ください。
アプリケーション定義のフックプロシージャをフックチェーン内にインストールします。フックプロシージャをインストールすると、特定のイベントタイプを監視できます。監視の対象になるイベントは、特定のスレッド、または呼び出し側スレッドと同じデスクトップ内のすべてのスレッドに関連付けられているものです。
HHOOK SetWindowsHookEx( int idHook, // フックタイプ HOOKPROC lpfn, // フックプロシージャ HINSTANCE hMod, // アプリケーションインスタンスのハンドル DWORD dwThreadId // スレッドの識別子 );
パラメータ
- idHook
- インストール対象のフックタイプを指定します。次の値のいずれかを指定します。
値 説明 WH_CALLWNDPROC システムが目的のウィンドウプロシージャへ送信したメッセージを監視する 1 個のフックプロシージャをインストールします。詳細については、CallWndProc フックプロシージャの説明を参照してください。 WH_CALLWNDPROCRET 目的のウィンドウプロシージャが処理したばかりのメッセージを監視する 1 個のフックプロシージャをインストールします。詳細については、CallWndRetProc フックプロシージャの説明を参照してください。 WH_CBT コンピュータを利用したトレーニング(CBT)アプリケーションに有用な通知を受け取る 1 個のフックプロシージャをインストールします。詳細については、CBTProc フックプロシージャの説明を参照してください。 WH_DEBUG ほかのフックプロシージャのデバッグに有用な 1 個のフックプロシージャをインストールします。詳細については、DebugProc フックプロシージャの説明を参照してください。 WH_FOREGROUNDIDLE アプリケーションのフォアグラウンドスレッドがアイドル状態になろうとしているときに呼び出される、1 個のフックプロシージャをインストールします。アイドル時に優先順位の低いタスクを実行する場合、このフックは役に立ちます。詳細については、ForegroundIdleProc フックプロシージャの説明を参照してください。 WH_GETMESSAGE メッセージキューへポストされたメッセージを監視する 1 個のフックプロシージャをインストールします。詳細については、GetMsgProc フックプロシージャの説明を参照してください。 WH_JOURNALPLAYBACK WH_JOURNALRECORD フックプロシージャが既に記録したメッセージをポストする 1 個のフックプロシージャをインストールします。詳細については、JournalPlaybackProc フックプロシージャの説明を参照してください。 WH_JOURNALRECORD システムメッセージキューへポストされた入力メッセージを記録する 1 個のフックプロシージャをインストールします。マクロを記録する際に、このフックは役立ちます。詳細については、JournalRecordProc フックプロシージャの説明を参照してください。 WH_KEYBOARD キーストロークメッセージを監視する 1 個のフックプロシージャをインストールします。詳細については、KeyboardProc フックプロシージャの説明を参照してください。 WH_KEYBOARD_LL Windows NT/2000:低水準のキーボード入力イベントを監視する 1 個のフックプロシージャをインストールします。詳細については、LowLevelKeyboardProc フックプロシージャの説明を参照してください。 WH_MOUSE マウスメッセージを監視する 1 個のフックプロシージャをインストールします。詳細については、MouseProc フックプロシージャの説明を参照してください。 WH_MOUSE_LL Windows NT/2000:低水準のマウス入力イベントを監視する 1 個のフックプロシージャをインストールします。詳細については、LowLevelMouseProc フックプロシージャの説明を参照してください。 WH_MSGFILTER ダイアログボックス、メッセージボックス、メニュー、スクロールバーのいずれかへの入力イベントの結果として生成されたメッセージを監視する 1 個のフックプロシージャをインストールします。詳細については、MessageProc フックプロシージャの説明を参照してください。 WH_SHELL シェルアプリケーションにとって有用な通知を受け取る 1 個のフックプロシージャをインストールします。詳細については、ShellProc フックプロシージャの説明を参照してください。 WH_SYSMSGFILTER ダイアログボックス、メッセージボックス、メニュー、スクロールバーのいずれかへの入力イベントの結果として生成されたメッセージを監視する 1 個のフックプロシージャをインストールします。このフックプロシージャは、呼び出し側スレッドと同じデスクトップ内のすべてのアプリケーションを対象とするこれらのメッセージを監視します。詳細については、SysMsgProc フックプロシージャの説明を参照してください。
- 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)内に存在していなければなりません。グローバルフックは、特別な目的のアプリケーションでのみ、またはアプリケーションのデバッグの際に開発を支援する目的でのみ使うべきです。ライブラリでフックの必要がなくなった場合、そのフックに対応するフックプロシージャを削除するべきです。
対応情報
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winuser.h 内で宣言、Windows.h をインクルード
インポートライブラリ:User32.lib を使用
Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装
参照
CallNextHookEx, CallWndProc, CallWndRetProc, CBTProc, DebugProc, ForegroundIdleProc, GetMsgProc, JournalPlaybackProc, JournalRecordProc, LowLevelKeyboardProc, LowLevelMouseProc KeyboardProc, MouseProc, MessageProc, ShellProc, SysMsgProc, UnhookWindowsHookEx