LowLevelKeyboardProc-Funktion
BESCHREIBUNG
Eine anwendungsdefinierte oder bibliotheksdefinierte Rückruffunktion, die mit der SetWindowsHookExA-Funktion/SetWindowsHookExW verwendet wird. Das System ruft diese Funktion jedes Mal auf, wenn ein neues Tastatureingabeereignis in einer Threadeingabewarteschlange bereitgestellt wird.
Hinweis
Wenn diese Rückruffunktion als Reaktion auf eine Änderung des Zustands eines Schlüssels aufgerufen wird, wird die Rückruffunktion aufgerufen, bevor der asynchrone Zustand des Schlüssels aktualisiert wird. Folglich kann der asynchrone Zustand des Schlüssels nicht durch Aufrufen von GetAsyncKeyState innerhalb der Rückruffunktion bestimmt werden.
Der HOOKPROC-Typ definiert einen Zeiger auf diese Rückruffunktion. LowLevelKeyboardProc ist ein Platzhalter für den anwendungsdefinierte oder bibliotheksdefinierte Funktionsnamen.
LRESULT CALLBACK LowLevelKeyboardProc(
_In_ int nCode,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
Parameter
Code [in]
Typ: int
Ein Code, mit dem die Hookprozedur bestimmt, wie die Nachricht verarbeitet werden soll.
Wenn nCode kleiner als null ist, muss die Hookprozedur die Nachricht ohne weitere Verarbeitung an die CallNextHookEx-Funktion übergeben und den von CallNextHookEx zurückgegebenen Wert zurückgeben.
Dieser Parameter kann einen der folgenden Werte annehmen.
Wert | Bedeutung |
---|---|
HC_ACTION 0 | Die Parameter wParam und lParam enthalten Informationen zu einer Tastaturmeldung. |
wParam [in]
Typ: WPARAM
Der Bezeichner der Tastaturnachricht.
Dieser Parameter kann eine der folgenden Meldungen sein: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN oder WM_SYSKEYUP.
lParam [in]
Typ: LPARAM
Ein Zeiger auf eine KBDLLHOOKSTRUCT-Struktur .
Gibt zurück
Typ: LRESULT
Wenn nCode kleiner als null ist, muss die Hookprozedur den von CallNextHookEx zurückgegebenen Wert zurückgeben.
Wenn nCode größer als oder gleich 0 ist und die Hookprozedur die Nachricht nicht verarbeitet hat, wird dringend empfohlen, CallNextHookEx aufzurufen und den zurückgegebenen Wert zurückzugeben. Andernfalls erhalten andere Anwendungen, die WH_KEYBOARD_LL Hooks installiert haben, keine Hookbenachrichtigungen und verhalten sich daher möglicherweise falsch.
Wenn die Hookprozedur die Nachricht verarbeitet hat, wird möglicherweise ein Wert ungleich null zurückgegeben, um zu verhindern, dass das System die Nachricht an den Rest der Hookkette oder an die Zielfensterprozedur übergibt.
Hinweise
Eine Anwendung installiert die Hookprozedur, indem sie den WH_KEYBOARD_LL Hooktyp und einen Zeiger auf die Hookprozedur in einem Aufruf der SetWindowsHookExA/SetWindowsHookExW-Funktion angibt.
Dieser Hook wird im Kontext des Threads aufgerufen, von dem er installiert wurde. Der Aufruf erfolgt durch Senden einer Nachricht an den Thread, der den Hook installiert hat. Daher muss der Thread, der den Hook installiert hat, über eine Meldungsschleife verfügen.
Die Tastatureingabe kann vom lokalen Tastaturtreiber oder von Aufrufen der keybd_event-Funktion stammen. Wenn die Eingabe von einem Aufruf von keybd_event stammt, wurde die Eingabe "eingefügt". Der WH_KEYBOARD_LL Hook wird jedoch nicht in einen anderen Prozess eingefügt. Stattdessen wechselt der Kontext zurück zu dem Prozess, der den Hook installiert hat, und er wird im ursprünglichen Kontext aufgerufen. Anschließend wechselt der Kontext zurück zu der Anwendung, die das Ereignis generiert hat.
Die Hookprozedur sollte eine Nachricht in kürzerer Zeit als der im LowLevelHooksTimeout-Wert im folgenden Registrierungsschlüssel angegebene Dateneintrag verarbeiten:
HKEY_CURRENT_USER**\**Control Panel**\**Desktop
Der Wert ist in Millisekunden angegeben. Wenn für die Hookprozedur ein Zeitüberschreitungsüberschreitung besteht, übergibt das System die Nachricht an den nächsten Hook. Unter Windows 7 und höher wird der Hook jedoch automatisch entfernt, ohne aufgerufen zu werden. Es gibt keine Möglichkeit für die Anwendung zu wissen, ob der Hook entfernt wurde.
Windows 10 Version 1709 und höher Der vom System zulässige maximale Timeoutwert beträgt 1000 Millisekunden (1 Sekunde). Das System verwendet standardmäßig ein Timeout von 1000 Millisekunden, wenn der LowLevelHooksTimeout-Wert auf einen Wert größer als 1000 festgelegt ist.
Hinweis
Debughooks können diese Art von Tastaturhaken auf niedriger Ebene nicht nachverfolgen. Wenn die Anwendung Hooks auf niedriger Ebene verwenden muss, sollten die Hooks in einem dedizierten Thread ausgeführt werden, der die Arbeit an einen Workerthread übergibt und dann sofort zurückgibt. In den meisten Fällen, in denen die Anwendung Hooks auf niedriger Ebene verwenden muss, sollte sie stattdessen rohe Eingaben überwachen. Dies liegt daran, dass unformatierte Eingaben Maus- und Tastaturnachrichten asynchron überwachen können, die auf andere Threads ausgerichtet sind, effektiver als Hooks auf niedriger Ebene. Weitere Informationen zu rohen Eingaben finden Sie unter Rohdateneingabe.