SetWindowsHookExA 関数 (winuser.h)
アプリケーション定義のフック プロシージャをフック チェーンにインストールします。 フック手順をインストールして、システムで特定の種類のイベントを監視します。 これらのイベントは、特定のスレッドまたは呼び出し元スレッドと同じデスクトップ内のすべてのスレッドに関連付けられます。
構文
HHOOK SetWindowsHookExA(
[in] int idHook,
[in] HOOKPROC lpfn,
[in] HINSTANCE hmod,
[in] DWORD dwThreadId
);
パラメーター
[in] idHook
型: int
インストールするフック プロシージャの種類。 このパラメーターには、次のいずれかの値を指定できます。
価値 | 意味 |
---|---|
|
システムがメッセージを宛先ウィンドウ・プロシージャーに送信する前にメッセージをモニターするフック・プロシージャーをインストールします。 詳細については、CallWndProc フック プロシージャを参照してください。 |
|
宛先ウィンドウ プロシージャによって処理されたメッセージを監視するフック プロシージャをインストールします。 詳細については、[HOOKPROC コールバック関数](nc-winuser-hookproc.md) フック プロシージャを参照してください。 |
|
CBT アプリケーションに役立つ通知を受け取るフック プロシージャをインストールします。 詳細については、[CBTProc](/windows/win32/winmsg/cbtproc) フック プロシージャを参照してください。 |
|
他のフック プロシージャのデバッグに役立つフック プロシージャをインストールします。 詳細については、DebugProc フック プロシージャを参照してください。 |
|
アプリケーションのフォアグラウンド スレッドがアイドル状態になったときに呼び出されるフック プロシージャをインストールします。 このフックは、アイドル時間中に優先度の低いタスクを実行する場合に便利です。 詳細については、ForegroundIdleProc フック プロシージャを参照してください。 |
|
メッセージ キューにポストされたメッセージを監視するフック プロシージャをインストールします。 詳細については、GetMsgProc フック プロシージャを参照してください。 |
|
警告 Windows 11 以降の: ジャーナル フック API はサポートされていません。 代わりに、SendInput TextInput API を使用することをお勧めします。 WH_JOURNALRECORD フック プロシージャによって以前に記録されたメッセージをポストするフック プロシージャをインストールします。 詳細については、JournalPlaybackProc フック プロシージャを参照してください。 |
|
警告 Windows 11 以降の: ジャーナル フック API はサポートされていません。 代わりに、SendInput TextInput API を使用することをお勧めします。 システム メッセージ キューにポストされた入力メッセージを記録するフック プロシージャをインストールします。 このフックは、マクロを記録する場合に便利です。 詳細については、JournalRecordProc フック プロシージャを参照してください。 |
|
キーストローク メッセージを監視するフック プロシージャをインストールします。 詳細については、KeyboardProc フックの手順を参照してください。 |
|
低レベルのキーボード入力イベントを監視するフック プロシージャをインストールします。 詳細については、LowLevelKeyboardProc フック プロシージャを参照してください。 |
|
マウス メッセージを監視するフック プロシージャをインストールします。 詳細については、MouseProc フックの手順を参照してください。 |
|
低レベルのマウス入力イベントを監視するフック プロシージャをインストールします。 詳細については、LowLevelMouseProc フック プロシージャを参照してください。 |
|
ダイアログ ボックス、メッセージ ボックス、メニュー、またはスクロール バーの入力イベントの結果として生成されたメッセージを監視するフック プロシージャをインストールします。 詳細については、MessageProc フックプロシージャを参照してください。 |
|
シェル アプリケーションに役立つ通知を受け取るフック プロシージャをインストールします。 詳細については、[ShellProc](/windows/win32/winmsg/shellproc) フック プロシージャを参照してください。 |
|
ダイアログ ボックス、メッセージ ボックス、メニュー、またはスクロール バーの入力イベントの結果として生成されたメッセージを監視するフック プロシージャをインストールします。 フック プロシージャは、呼び出し元スレッドと同じデスクトップ内のすべてのアプリケーションについて、これらのメッセージを監視します。 詳細については、sysMsgProc フックプロシージャ |
[in] lpfn
型: HOOKPROC
フック プロシージャへのポインター。
dwThreadId パラメーターが 0 の場合、または別のプロセスによって作成されたスレッドの識別子を指定する場合、lpfn パラメーターは DLL 内のフック プロシージャを指す必要があります。 それ以外の場合、lpfn
[in] hmod
型: HINSTANCE
lpfn パラメーターによって指されるフック プロシージャを含む DLL へのハンドル。
[in] dwThreadId
型: DWORD
フック プロシージャを関連付けるスレッドの識別子。 デスクトップ アプリの場合、このパラメーターが 0 の場合、フック プロシージャは、呼び出し元のスレッドと同じデスクトップで実行されているすべての既存のスレッドに関連付けられます。 Windows ストア アプリについては、「解説」セクションを参照してください。
戻り値
型: HHOOK
関数が成功した場合、戻り値はフック プロシージャへのハンドルです。
関数が失敗した場合、戻り値は NULL
備考
SetWindowsHookEx を使用して、DLL を別のプロセスに挿入できます。 32 ビット DLL を 64 ビット プロセスに挿入することはできません。また、64 ビット DLL を 32 ビット プロセスに挿入することはできません。 アプリケーションが他のプロセスでフックを使用する必要がある場合は、32 ビットのアプリケーション呼び出し SetWindowsHookEx 32 ビット DLL を 32 ビット プロセスに挿入し、64 ビットのアプリケーション呼び出し SetWindowsHookEx 64 ビット DLL を 64 ビット プロセスに挿入する必要があります。 32 ビット DLL と 64 ビット DLL の名前は異なる必要があります。
フックはアプリケーションのコンテキストで実行されるため、アプリケーションの "ビット" と一致する必要があります。 32 ビット アプリケーションが 64 ビット Windows にグローバル フックをインストールする場合、32 ビット フックは各 32 ビット プロセスに挿入されます (通常のセキュリティ境界が適用されます)。 64 ビット プロセスでは、スレッドは引き続き "フック済み" としてマークされます。ただし、32 ビット アプリケーションではフック コードを実行する必要があるため、システムはフック アプリのコンテキストでフックを実行します。具体的には、SetWindowsHookExを呼び出したスレッドで。 これは、フック アプリケーションがメッセージをポンプし続ける必要があるか、64 ビット プロセスの正常な機能をブロックする可能性があることを意味します。
64 ビット アプリケーションが 64 ビット Windows にグローバル フックをインストールする場合、64 ビット フックは各 64 ビット プロセスに挿入され、32 ビット プロセスはすべてフック アプリケーションへのコールバックを使用します。
64 ビット Windows インストールのデスクトップ上のすべてのアプリケーションをフックするには、32 ビット グローバル フックと 64 ビット グローバル フックをそれぞれ適切なプロセスからインストールし、通常の機能をブロックしないように、フック アプリケーションでメッセージをポンプで送り続けてください。 既に 32 ビットグローバル フック アプリケーションがあり、各アプリケーションのコンテキストで実行する必要がない場合は、64 ビット バージョンを作成する必要がない場合があります。
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 | グローバルのみ |
指定したフックの種類では、スレッド フックが最初に呼び出され、次にグローバル フックが呼び出されます。 WH_MOUSE、WH_KEYBOARD、WH_JOURNAL*、WH_SHELL、および低レベルのフックは、フックを処理するスレッドではなく、フックをインストールしたスレッドで呼び出すことができることに注意してください。 これらのフックの場合、32 ビット フックがフック チェーンの 64 ビット フックより前にある場合、32 ビットと 64 ビットの両方のフックが呼び出される可能性があります。
グローバル フックは共有リソースであり、インストールすると、呼び出し元のスレッドと同じデスクトップ内のすべてのアプリケーションに影響します。 すべてのグローバル フック関数は、ライブラリ内に存在する必要があります。 グローバル フックは、特殊な用途のアプリケーションに制限するか、アプリケーションのデバッグ中に開発支援として使用する必要があります。 フックが不要になったライブラリでは、そのフック プロシージャを削除する必要があります。
Windows ストア アプリ開発 dwThreadId が 0 の場合、ウィンドウ フック DLL は、いずれかの UIAccess プロセス (アクセシビリティ ツール) によってインストールされない限り、Windows ストア アプリ プロセスと Windows ランタイム ブローカー プロセスに対してインプロセスで読み込まれません。 通知は、次のフックのインストーラーのスレッドで配信されます。
- WH_JOURNALPLAYBACK
- WH_JOURNALRECORD
- WH_KEYBOARD
- WH_KEYBOARD_LL
- WH_MOUSE
- WH_MOUSE_LL
例
例については、「フックプロシージャのインストールとリリース」を参照してください。
手記
winuser.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして SetWindowsHookEx を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされる最小サーバー | Windows 2000 Server [デスクトップ アプリのみ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | winuser.h (Windows.h を含む) |
ライブラリ | User32.lib |
DLL | User32.dll |
API セットの | ext-ms-win-ntuser-window-l1-1-0 (Windows 8 で導入) |
関連項目
CallNextHookEx 関数 を
CallWindowProc 関数 を
UnhookWindowsHookEx 関数 の
CBTProc の
CallWndProc の
CallWndRetProc の
DebugProc の
ForegroundIdleProc の
GetMsgProc の
ShellProc の
SysMsgProc の
概念