LowLevelMouseProc-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 Mauseingabeereignis in einer Threadeingabewarteschlange veröffentlicht werden soll.
Der HOOKPROC-Typ definiert einen Zeiger auf diese Rückruffunktion. LowLevelMouseProc ist ein Platzhalter für den anwendungsdefinierte oder bibliotheksdefinierte Funktionsnamen.
LowLevelMouseProc ist ein Platzhalter für den anwendungsdefinierte oder bibliotheksdefinierte Funktionsnamen.
LRESULT CALLBACK LowLevelMouseProc(
_In_ int nCode,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
Parameter
nCode [in]
Typ: int
Ein Code, den die Hookprozedur verwendet, um zu bestimmen, wie die Nachricht verarbeitet werden soll.
Wenn nCode kleiner als 0 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 Mausnachricht. |
wParam [in]
Typ: WPARAM
Der Bezeichner der Mausnachricht.
Dieser Parameter kann eine der folgenden Nachrichten sein: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN oder WM_RBUTTONUP.
lParam [in]
Typ: LPARAM
Ein Zeiger auf eine MSLLHOOKSTRUCT-Struktur .
Gibt zurück
Typ: LRESULT
Wenn nCode kleiner als 0 ist, muss die Hookprozedur den von CallNextHookEx zurückgegebenen Wert zurückgeben.
Wenn nCode größer oder gleich null 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_MOUSE_LL Hooks installiert haben, keine Hookbenachrichtigungen und verhalten sich daher möglicherweise falsch.
Wenn die Hookprozedur die Nachricht verarbeitet hat, gibt sie möglicherweise einen nichtzero-Wert zurück, um zu verhindern, dass das System die Nachricht an den Rest der Hookkette oder die Zielfensterprozedur übergibt.
Hinweise
Eine Anwendung installiert die Hookprozedur, indem sie den WH_MOUSE_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 Nachrichtenschleife verfügen.
Die Mauseingabe kann vom lokalen Maustreiber oder von Aufrufen der mouse_event-Funktion stammen. Wenn die Eingabe von einem Aufruf an mouse_event stammt, wurde die Eingabe "eingefügt". Der WH_MOUSE_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 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 Dateneintrag verarbeiten, der im Wert LowLevelHooksTimeout im folgenden Registrierungsschlüssel angegeben ist:
HKEY_CURRENT_USER\Control Panel\Desktop
Der Wert ist in Millisekunden angegeben. Wenn die Hookprozedur ein Zeitüberschreitung aufweist, übergibt das System die Nachricht an den nächsten Hook. Unter Windows 7 und höher wird der Hook jedoch unbeaufsichtigt 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 maximale Timeoutwert, den das System zulässt, 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
Debughaken können diese Art von Maushaken auf niedriger Ebene nicht nachverfolgen. Wenn die Anwendung Hooks auf niedriger Ebene verwenden muss, sollten sie die Hooks in einem dedizierten Thread ausführen, der die Arbeit an einen Workerthread übergibt und 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, die für andere Threads bestimmt sind, effektiver überwachen können als Hooks auf niedriger Ebene. Weitere Informationen zu rohen Eingaben finden Sie unter Rohdateneingabe.