LowLevelKeyboardProc 関数
説明
SetWindowsHookExA SetWindowsHookExW関数で使用されるアプリケーション定義またはライブラリ定義のコールバック関数。/ システムは、新しいキーボード入力イベントがスレッド入力キューにポストされようとするたびに、この関数を呼び出します。
注意
キーの状態の変化に応じてこのコールバック関数が呼び出されると、キーの非同期状態が更新される前にコールバック関数が呼び出されます。 そのため、コールバック関数内から GetAsyncKeyState を 呼び出すことで、キーの非同期状態を特定することはできません。
HOOKPROC 型は、このコールバック関数へのポインターを定義します。 LowLevelKeyboardProc は、アプリケーション定義またはライブラリ定義関数名のプレースホルダーです。
LRESULT CALLBACK LowLevelKeyboardProc(
_In_ int nCode,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
パラメーター
code [in]
型: int
フック プロシージャがメッセージの処理方法を決定するために使用するコード。
nCode が 0 未満の場合、フック プロシージャは、それ以上の処理を行わずに CallNextHookEx 関数にメッセージを渡す必要があり、CallNextHookEx によって返される値を返す必要があります。
このパラメーターには、次の値のいずれかを指定できます。
値 | 説明 |
---|---|
HC_ACTION 0 | wParam パラメーターと lParam パラメーターには、キーボード メッセージに関する情報が含まれています。 |
wParam [in]
型: WPARAM
キーボード メッセージの識別子。
このパラメーターには、 WM_KEYDOWN、WM_KEYUP、 WM_SYSKEYDOWN、 またはWM_SYSKEYUPのいずれかのメッセージを 指定できます。
lParam [in]
型: LPARAM
KBDLLHOOKSTRUCT 構造体へのポインター。
戻り値
型: LRESULT
nCode が 0 未満の場合、フック プロシージャは CallNextHookEx によって返される値を返す必要があります。
nCode が 0 以上で、フック プロシージャがメッセージを処理しなかった場合は、CallNextHookEx を呼び出し、返される値を返すよう強くお勧めします。それ以外の場合、WH_KEYBOARD_LLフックがインストールされている他のアプリケーションはフック通知を受け取らず、その結果として正しく動作しない可能性があります。
フック プロシージャがメッセージを処理した場合、システムがフック チェーンまたはターゲット ウィンドウ プロシージャの残りの部分にメッセージを渡さないようにするために、0 以外の値を返す可能性があります。
注釈
アプリケーションは、setWindowsHookExA/SetWindowsHookExW 関数の呼び出しで、WH_KEYBOARD_LLフックの種類とフック プロシージャへのポインターを指定して、フック プロシージャをインストールします。
このフックは、インストールしたスレッドのコンテキストで呼び出されます。 呼び出しは、フックをインストールしたスレッドにメッセージを送信することによって行われます。 したがって、フックをインストールしたスレッドにはメッセージ ループが必要です。
キーボード入力は、ローカル キーボード ドライバーまたは keybd_event 関数の呼び出しから取得できます。 入力が keybd_event の呼び出しから送信された場合、入力は "挿入" されました。 ただし、 WH_KEYBOARD_LL フックは別のプロセスに挿入されません。 代わりに、コンテキストはフックをインストールしたプロセスに戻り、元のコンテキストで呼び出されます。 その後、コンテキストは、イベントを生成したアプリケーションに戻ります。
フック プロシージャは、次のレジストリ キーの LowLevelHooksTimeout 値で指定されたデータ エントリよりも短い時間でメッセージを処理する必要があります。
HKEY_CURRENT_USER**\**Control Panel**\**Desktop
値の単位はミリ秒です。 フック・プロシージャーがタイムアウトした場合、システムはメッセージを次のフックに渡します。 ただし、Windows 7 以降では、フックは呼び出されることなく自動的に削除されます。 フックが削除されたかどうかをアプリケーションが認識する方法はありません。
バージョン 1709 以降Windows 10システムで許容される最大タイムアウト値は 1000 ミリ秒 (1 秒) です。 LowLevelHooksTimeout 値が 1000 より大きい値に設定されている場合、システムは既定で 1000 ミリ秒のタイムアウトを使用します。
注意
デバッグ フックでは、この種類の低レベルのキーボード フックを追跡できません。 アプリケーションで低レベルのフックを使用する必要がある場合は、作業をワーカー スレッドに渡してすぐに戻る専用スレッドでフックを実行する必要があります。 アプリケーションで低レベルのフックを使用する必要があるほとんどの場合は、代わりに生の入力を監視する必要があります。 これは、生の入力では、低レベルのフックよりも効果的に、他のスレッドを対象とするマウスメッセージとキーボードメッセージを非同期的に監視できるためです。 生入力の詳細については、「 生入力」を参照してください。