msdnのSetWindowsHookExA functionの日本語訳です。C#で、グローバル・フックを使用するときに使用します。
フック・チェーンに、アプリケーションに定義されたフック・プロシージャをインストールします。
あなたは、システムの特定の型のイベントをモニタするために、フック・プロシージャをインストールするでしょう。これらのイベントは、特定のスレッドや呼び出しているスレッドと同じデスクトップ内のすべてのスレッドで関連付けられています。
構文
Syntax
HHOOK SetWindowsHookExA(
int idHook,
HOOKPROC lpfn,
HINSTANCE hmod,
DWORD dwThreadId
);
パラメーター
Parameters
idHook
Type: int
インストールするフック・プロシージャの種類。このパラメータは、以下の値のいずれか1つを取ります。
値 | 意味 |
---|---|
WH_CALLWNDPROC 4 |
システムが、出力先のウィンドウ・プロシージャに送信する前に、メッセージを監視するフック・プロシージャをインストールします。詳細については、CallWndProcフック・プロシージャを参照してください。 |
WH_CALLWNDPROCRET 12 |
それらが出力先のウィンドウ・プロシージャによって処理された後、メッセージを監視するフック・プロシージャをインストールします。詳細については、CallWndRetProcフック・プロシージャを参照してください。 |
WH_CBT 5 |
CBTアプリケーションに役立つ通知を受け取るフック・プロシージャをインストールします。詳細については、CBTProcフック・プロシージャを参照してください。 |
WH_DEBUG 9 |
他のフック・プロシージャをデバッグするために役立つフック・プロシージャをインストールします。詳細については、DebugProcフック・プロシージャを参照してください。 |
WH_FOREGROUNDIDLE 11 |
アプリケーションのフォアグラウンドのスレッドが、アイドル状態にあるようになろうとしているとき、呼び出されるフック・プロシージャをインストールします。このフックは、アイドル時間中に、優先度の低いタスクを実行するのに役立ちます。詳細については、ForegroundIdleProcフック・プロシージャを参照してください。 |
WH_GETMESSAGE 3 |
メッセージ・キューに投稿されたメッセージを監視するフック・プロシージャをインストールします。詳細については、GetMsgProcフック・プロシージャを参照してください。 |
WH_JOURNALPLAYBACK 1 |
WH_JOURNALRECORDフック・プロシージャによって以前に記録されたメッセージを投稿するフック・プロシージャをインストールします。詳細については、JournalPlaybackProcフック・プロシージャを参照してください。 |
WH_JOURNALRECORD 0 |
システム・メッセージ・キューに投稿された入力メッセージを記録するフック・プロシージャをインストールします。このフックは、マクロを記録するために役に立ちます。詳細については、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フック・プロシージャを参照してください。 |
lpfn
Type: HOOKPROC
フック・プロシージャへのポインター。dwThreadIdパラメータがゼロ、あるいは、いろいろなプロセスで作成されるスレッドの識別子を指定するの場合、lpfnパラメータは、DLLのフック・プロシージャを指している必要があります。それ以外の場合には、lpfnは、現在のプロセスに関連付けられたコード内のフック・プロシージャを指すことができます。
hmod
Type: HINSTANCE
フック・プロシージャが含まれているDLLへのハンドルは、lpfnパラメータによって、指されます。 dwThreadIdパラメータが、現在のプロセスで作成されるスレッドを指定する場合、そして、フック・プロシージャが、現在のプロセスと関連付けられたコード内にある場合、hModパラメータは、NULLに設定されている必要があります。
dwThreadId
Type: DWORD
フック・プロシージャを持つスレッドの識別子は、関連しています。デスクトップ・アプリのために、 このパラメータが、ゼロの場合、フック・プロシージャは、呼び出し側のスレッドとして、同じデスクトップで動作しているすべての既存のスレッドに関連付けられています。Windowsストア・アプリについては、Remarksセクションを参照してください。
Return値
Return Value
Type: Type: HHOOK
関数が成功した場合、戻り値は、フック・プロシージャのハンドルです。
関数が失敗する場合、戻り値は、NULLです。拡張エラー情報を取得するために、GetLastErrorを呼び出します。
注釈
Remarks
SetWindowsHookExは、DLLを別のプロセスに注入するために使用することができます。32bitのDLLは、64bitのプロセスに注入することができません。そして、64bitのDLLは、32bitのプロセスに注入することができません。アプリケーションが、他のプロセスのフックの使用を必要とする場合、 32bitアプリケーションが、32bitのプロセスを32bitのDLLに注入するためにSetWindowsHookExを呼び出し、64bitアプリケーションは、64bitのDLLを64bitのプロセスに注入するために、SetWindowsHookExを呼び出すことが必要です。32bitと64bitのDLLは、異なる名前を持つ必要があります。
フックは、アプリケーションのコンテキストで実行されるため、それらは、アプリケーションの"bitness"と一致する必要があります。32bitアプリケーションが、64bitのウィンドウに、グローバル・フックをインストールする場合、32bitのフックは、それぞれの32bitのプロセスに注入されます。(通常のセキュリティ境界が、適用されます)。64bitのプロセスでは、スレッドは、まだ、"hooked"とマークされています。しかしながら、32bitアプリケーションが、フック・コードを実行する必要があるため、システムは、フックアプリのコンテキストでフックを実行します。 具体的には、SetWindowsHookExを呼び出したスレッドで。これは、フックするアプリケーションが、メッセージを送り続ける、あるいは、それは、64bitのプロセスの通常の機能をブロックする可能性があることを示しています。
64bitアプリケーションが、64bitのWindowsに、グローバル・フックをインストールする場合、すべての32bitプロセスは、フックするアプリケーションへのコールバックを使用する間、64bitフックは、それぞれの64bitプロセスに注入されます。
64bitのWindowsのインストールのデスクトップに、すべてのアプリケーションをフックするために、 適切なプロセスからそれぞれ、32bitのグローバル・フックと64bitのグローバル・フックをインストールします。そして、通常の機能を妨げないように、フックするアプリケーションにメッセージを送り続けてください。あなたが、すでに、32bitのグローバル・フックするアプリケーションを持っている場合、そして、それは、64bitのバージョンを作成する必要がない、それぞれのアプリケーションのコンテクストで実行する必要はありません。
hModパラメータが、NULLである場合、エラーが、発生する、そして、dwThreadIdパラメータが、ゼロである、あるいは、他のプロセスによって作成されるスレッドの識別子を指定する場合があります。
CallNextHookEx関数を呼び出すことは、次のフック・プロシージャにチェーンすることはオプションですが、強くお勧めします。;それ以外の場合には、フックをインストールした他のアプリケーションは、フック通知を受け取りません。そして、結果として正しく動作しない場合があります。他のアプリケーションによって、通知の表示を絶対に防ぐ必要がない限り、あなたが、CallNextHookExを呼び出す必要があります。
終了する前に、アプリケーションは、UnhookWindowsHookEx関数を呼び出して、フックに関連付けられたシステム・リソースを解放する必要があります。
フックの範囲は、フック型に依存します。いくつかのフックは、グローバル・スコープでのみ設定できます。;以下の表で示すように、他は、特定のスレッドのみに設定できます。
フック | 範囲 |
---|---|
WH_CALLWNDPROC | スレッドやグローバル |
WH_CALLWNDPROCRET | スレッドやグローバル |
WH_CBT | スレッドやグローバル |
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と低レベルのフックが、スレッドの上で呼び出すことができることに注意してください。フックを処理するスレッドではなく、フックをインストールしました。フック・チェーンの中に、32bitのフックが、64bitのフックの前にある場合、これらのフックのために、32bitと64bitのフックが、呼び出されるかもしれません。
呼び出し側のスレッドとして、グローバル・フックは、共有リソースであり、1つのインストールは、同じデスクトップ内のすべてのアプリケーションに影響します。すべてのグローバル・フック関数は、ライブラリ内にある必要があります。グローバル・フックは、アプリケーションをデバッグしている間、特殊用途のアプリケーションに限定するか、開発支援として使用する必要があります。フックをもはや必要としないライブラリは、そのフック・プロシージャを削除する必要があります。
Windowsストア・アプリ開発のdwThreadIdが、ゼロの場合、続いて、ウィンドウ・フックDLLは、いずれかの(アクセスできるツールの)UIAccessプロセスによってインストールされない限り、Windowsストア・アプリ・プロセスとWindows Runtimeブローカー・プロセスの処理中には、読み込まれません。通知は、これらのフックのために、インストーラのスレッドの上に配信されます。:
- WH_JOURNALPLAYBACK
- WH_JOURNALRECORD
- WH_KEYBOARD
- WH_KEYBOARD_LL
- WH_MOUSE
- WH_MOUSE_LL
この動作は、アーキテクチャの不一致がある場合、たとえば、フックDLLが、32bit、そして、アプリケーションが、64bitで処理するとき、フックDLLと対象となるアプリケーション・プロセスの間で、何が起こるかに似ています。
例
Examples
Installing and Releasing Hook Proceduresを参照してください。
必要条件
Requirements
- Windows 2000 Professional[デスクトップ・アプリのみ]
- Windows 2000 Server[デスクトップ・アプリのみ]
- Windows
- winuser.h(Windows.hに含まれています)
- User32.lib
- User32.dll