次の方法で共有


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](/windows/win32/winmsg/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 フック プロシージャを参照してください。
WH_MOUSE
7

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

WH_MOUSE_LL
14

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

WH_MSGFILTER
-1

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

WH_SHELL
10
シェル アプリケーションに役立つ通知を受け取るフック プロシージャをインストールします。 詳細については、[ShellProc](/windows/win32/winmsg/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 ヘッダーは、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 の

JournalPlaybackProc

JournalRecordProc

KeyboardProc

LowLevelKeyboardProc

LowLevelMouseProc

MessageProc

MouseProc

ShellProc の

SysMsgProc の

概念

フック