SetWindowsHookExA 関数 (winuser.h)

アプリケーション定義のフック プロシージャをフック チェーンにインストールします。 フック プロシージャをインストールして、システムで特定の種類のイベントを監視します。 これらのイベントは、特定のスレッドまたは呼び出し元スレッドと同じデスクトップ内のすべてのスレッドに関連付けられます。

構文

HHOOK SetWindowsHookExA(
  [in] int       idHook,
  [in] HOOKPROC  lpfn,
  [in] HINSTANCE hmod,
  [in] DWORD     dwThreadId
);

パラメーター

[in] idHook

型: int

インストールするフック プロシージャの種類。 このパラメーターには、次の値のいずれかを指定できます。

意味
WH_CALLWNDPROC
4

システムがメッセージを宛先ウィンドウ プロシージャに送信する前にメッセージを監視するフック プロシージャをインストールします。 詳細については、 CallWndProc フック プロシージャを参照してください。

WH_CALLWNDPROCRET
12
宛先ウィンドウ プロシージャによって処理された後にメッセージを監視するフック プロシージャをインストールします。 詳細については、[HOOKPROC コールバック関数](nc-winuser-hookproc.md) フック プロシージャを参照してください。
WH_CBT
5
CBT アプリケーションに役立つ通知を受け取るフック プロシージャをインストールします。 詳細については、 CBTProc フックの手順に関するページを参照してください。
WH_DEBUG
9

他のフック プロシージャのデバッグに役立つフック プロシージャをインストールします。 詳細については、「 DebugProc フック」の手順を参照してください。

WH_FOREGROUNDIDLE
11

アプリケーションのフォアグラウンド スレッドがアイドル状態になったときに呼び出されるフック プロシージャをインストールします。 このフックは、アイドル時間中に優先度の低いタスクを実行する場合に便利です。 詳細については、 ForegroundIdleProc フックプロシージャを参照してください。

WH_GETMESSAGE
3

メッセージ キューにポストされたメッセージを監視するフック プロシージャをインストールします。 詳細については、 GetMsgProc フックプロシージャを参照してください。

WH_JOURNALPLAYBACK
1

警告

Windows 11以降: ジャーナリング フック API はサポートされていません。 代わりに SendInput TextInput API を使用することをお勧めします。

WH_JOURNALRECORD フック プロシージャによって以前に記録されたメッセージを投稿するフック プロシージャをインストールします。 詳細については、 JournalPlaybackProc フックプロシージャを参照してください。

WH_JOURNALRECORD
0

警告

Windows 11以降: ジャーナリング フック API はサポートされていません。 代わりに SendInput TextInput API を使用することをお勧めします。

システム メッセージ キューにポストされた入力メッセージを記録するフック プロシージャをインストールします。 このフックは、マクロを記録する場合に便利です。 詳細については、 JournalRecordProc フック プロシージャを参照してください。

WH_KEYBOARD
2

キーストローク メッセージを監視するフック プロシージャをインストールします。 詳細については、 KeyboardProc フックの手順に関するページを参照してください。

WH_KEYBOARD_LL
13
低レベルのキーボード入力イベントを監視するフック プロシージャをインストールします。 詳細については、[LowLevelKeyboardProc](/windows/win32/winmsg/lowlevelkeyboardproc) フックプロシージャを参照してください。
WH_MOUSE
7

マウス メッセージを監視するフック プロシージャをインストールします。 詳細については、 MouseProc フックの手順に関するページを参照してください。

WH_MOUSE_LL
14

低レベルのマウス入力イベントを監視するフック プロシージャをインストールします。 詳細については、 LowLevelMouseProc フック プロシージャを参照してください。

WH_MSGFILTER
-1

ダイアログ ボックス、メッセージ ボックス、メニュー、またはスクロール バーの入力イベントの結果として生成されたメッセージを監視するフック プロシージャをインストールします。 詳細については、 MessageProc フックの手順に関するページを参照してください。

WH_SHELL
10
シェル アプリケーションに役立つ通知を受け取るフック プロシージャをインストールします。 詳細については、 ShellProc フックの手順に関するページを参照してください。
WH_SYSMSGFILTER
6

ダイアログ ボックス、メッセージ ボックス、メニュー、またはスクロール バーの入力イベントの結果として生成されたメッセージを監視するフック プロシージャをインストールします。 フック プロシージャは、呼び出し元スレッドと同じデスクトップ内のすべてのアプリケーションについて、これらのメッセージを監視します。 詳細については、 SysMsgProc フックプロシージャを参照してください。

[in] lpfn

種類: HOOKPROC

フック プロシージャへのポインター。 dwThreadId パラメーターが 0 の場合、または別のプロセスによって作成されたスレッドの識別子を指定する場合、lpfn パラメーターは DLL 内のフック プロシージャを指す必要があります。 それ以外の場合、 lpfn は、現在のプロセスに関連付けられているコード内のフック プロシージャを指すことができます。

[in] hmod

種類: HINSTANCE

lpfn パラメーターによって指されるフック プロシージャを含む DLL へのハンドル。 dwThreadId パラメーターが現在のプロセスによって作成されたスレッドを指定し、フック プロシージャが現在のプロセスに関連付けられているコード内にある場合は、hMod パラメーターを NULL に設定する必要があります。

[in] dwThreadId

型: DWORD

フック プロシージャを関連付けるスレッドの識別子。 デスクトップ アプリの場合、このパラメーターが 0 の場合、フック プロシージャは、呼び出し元のスレッドと同じデスクトップで実行されているすべての既存のスレッドに関連付けられます。 Windows ストア アプリについては、「解説」セクションを参照してください。

戻り値

種類: HHOOK

関数が成功した場合、戻り値はフック プロシージャへのハンドルです。

関数が失敗した場合は、返される値は NULL です。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

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 ビット バージョンを作成する必要がない場合があります。

hMod パラメーターが NULL、dwThreadId パラメーターが 0 であるか、別のプロセスによって作成されたスレッドの識別子を指定すると、エラーが発生する可能性があります。

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
この動作は、フック DLL とターゲット アプリケーション プロセスの間にアーキテクチャの不一致がある場合 (フック DLL が 32 ビットで、アプリケーション プロセスが 64 ビットの場合など) に似ています。

例については、「 フックプロシージャのインストールと解放」を参照してください。

注意

winuser.h ヘッダーは、SetWindowsHookEx をエイリアスとして定義します。このエイリアスは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択します。 encoding-neutral エイリアスの使用を encoding-neutral ではないコードと混在すると、コンパイル エラーまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー winuser.h (Windows.h を含む)
Library 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

JournalPlaybackProc

JournalRecordProc

KeyboardProc

LowLevelKeyboardProc

LowLevelMouseProc

MessageProc

MouseProc

ShellProc

SysMsgProc

概念

フック