SetWindowsHookExW 関数 (winuser.h)

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

構文

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

パラメーター

[in] idHook

型: int

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

意味
WH_CALLWNDPROC
4

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

WH_CALLWNDPROCRET
12

宛先ウィンドウ プロシージャによってメッセージが処理された後でメッセージを監視するフック プロシージャをインストールします。 詳細については、 HOOKPROC コールバック関数 フック プロシージャを参照してください。

WH_CBT
5

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

WH_DEBUG
9

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

WH_FOREGROUNDIDLE
11

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

WH_GETMESSAGE
3

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

WH_JOURNALPLAYBACK
1

警告

ジャーナリング フック API は、Windows 11以降サポートされていないため、今後のリリースで削除される予定です。 このため、代わりに SendInput TextInput API を呼び出す必要があります。

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

WH_JOURNALRECORD
0

警告

ジャーナリング フック API は、Windows 11以降サポートされていないため、今後のリリースで削除される予定です。 このため、代わりに 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 フックの手順に関するページを参照してください。

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 ビットプロセスに 32 ビット DLL を挿入し、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 パラメーターが NULLdwThreadId パラメーターが 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 バージョンを自動的に選択します。 エンコードに依存しないエイリアスをエンコードニュートラルでないコードと組み合わせて使用すると、コンパイルまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。

要件

要件
サポートされている最小のクライアント 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

概念

フック