Home > C# > WPF > イベント > グローバル・フック

SetWindowsHookExA関数(C#) MSDNのドキュメントの和訳

新規作成日 2019-11-14
最終更新日

msdnのSetWindowsHookExA functionの日本語訳です。C#で、グローバル・フックを使用するときに使用します。

フック・チェーンに、アプリケーションに定義されたフック・プロシージャをインストールします。

あなたは、システムの特定の型のイベントをモニタするために、フック・プロシージャをインストールするでしょう。これらのイベントは、特定のスレッドや呼び出しているスレッドと同じデスクトップ内のすべてのスレッドで関連付けられています。

構文

Syntax

C++
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
このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」