Condividi tramite


Funzione LowLevelKeyboardProc

Descrizione

Funzione di callback definita dall'applicazione o definita dalla libreria usata con la funzione SetWindowsHookExA/SetWindowsHookExW . Il sistema chiama questa funzione ogni volta che un nuovo evento di input della tastiera sta per essere pubblicato in una coda di input del thread.

Nota

Quando questa funzione di callback viene chiamata in risposta a una modifica nello stato di una chiave, la funzione di callback viene chiamata prima dell'aggiornamento dello stato asincrono della chiave. Di conseguenza, lo stato asincrono della chiave non può essere determinato chiamando GetAsyncKeyState dall'interno della funzione di callback.

Il tipo HOOKPROC definisce un puntatore a questa funzione di callback. LowLevelKeyboardProc è un segnaposto per il nome di funzione definito dall'applicazione o dalla libreria.

LRESULT CALLBACK LowLevelKeyboardProc(
  _In_ int    nCode,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);

Parametri

codice [in]

Tipo: int

Codice usato dalla routine di hook per determinare come elaborare il messaggio.

Se nCode è minore di zero, la procedura di hook deve passare il messaggio alla funzione CallNextHookEx senza ulteriore elaborazione e deve restituire il valore restituito da CallNextHookEx.

Questo parametro può avere uno dei valori seguenti.

Valore Significato
HC_ACTION 0 I parametri wParam e lParam contengono informazioni su un messaggio da tastiera.

wParam [in]

Tipo: WPARAM

Identificatore del messaggio della tastiera.

Questo parametro può essere uno dei messaggi seguenti: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN o WM_SYSKEYUP.

lParam [in]

Tipo: LPARAM

Puntatore a una struttura KBDLLHOOKSTRUCT .

Restituisce

Tipo: LRESULT

Se nCode è minore di zero, la procedura di hook deve restituire il valore restituito da CallNextHookEx.

Se nCode è maggiore o uguale a zero e la procedura di hook non ha elaborato il messaggio, è consigliabile chiamare CallNextHookEx e restituire il valore restituito; in caso contrario, altre applicazioni installate WH_KEYBOARD_LL hook non riceveranno notifiche di hook e potrebbero comportarsi in modo errato come risultato.

Se la procedura di hook ha elaborato il messaggio, può restituire un valore diverso da zero per impedire al sistema di passare il messaggio al resto della catena di hook o alla procedura della finestra di destinazione.

Commenti

Un'applicazione installa la procedura di hook specificando il tipo di hook WH_KEYBOARD_LL e un puntatore alla procedura di collegamento in una chiamata alla funzione SetWindowsHookExA/SetWindowsHookExW .

Questo hook viene chiamato nel contesto del thread installato. La chiamata viene effettuata inviando un messaggio al thread che ha installato l'hook. Pertanto, il thread che ha installato l'hook deve avere un ciclo di messaggi.

L'input della tastiera può venire dal driver della tastiera locale o dalle chiamate alla funzione di keybd_event . Se l'input proviene da una chiamata a keybd_event, l'input è stato "inserito". Tuttavia, il WH_KEYBOARD_LL hook non viene inserito in un altro processo. Il contesto torna invece al processo che ha installato l'hook e viene chiamato nel contesto originale. Il contesto torna quindi all'applicazione che ha generato l'evento.

La procedura di hook deve elaborare un messaggio in meno tempo rispetto alla voce di dati specificata nel valore LowLevelHooksTimeout nella chiave del Registro di sistema seguente:

HKEY_CURRENT_USER**\**Control Panel**\**Desktop

Il valore è espresso in millisecondi. Se la procedura di hook si verifica il timeout, il sistema passa il messaggio all'hook successivo. Tuttavia, in Windows 7 e versioni successive, l'hook viene rimosso in modo silenzioso senza essere chiamato. Non è possibile che l'applicazione sappia se l'hook viene rimosso.

Windows 10 versione 1709 e versioni successive Il valore massimo di timeout consentito dal sistema è 1000 millisecondi (1 secondo). Il sistema verrà predefinito usando un timeout di 1000 millisecondi se il valore LowLevelHooksTimeout è impostato su un valore maggiore di 1000.

Nota

I hook di debug non possono tenere traccia di questo tipo di ganci da tastiera di basso livello. Se l'applicazione deve usare hook di basso livello, deve eseguire i hook su un thread dedicato che passa il lavoro a un thread di lavoro e quindi restituisce immediatamente. Nella maggior parte dei casi in cui l'applicazione deve usare hook a basso livello, deve monitorare invece l'input non elaborato. Questo perché l'input non elaborato può monitorare in modo asincrono i messaggi del mouse e della tastiera destinati ad altri thread in modo più efficace rispetto ai ganci di basso livello. Per altre informazioni sull'input non elaborato, vedere Input non elaborato.

Vedi anche

CallNextHookEx

KBDLLHOOKSTRUCT

keybd_event

Setwindowshookex

WM_KEYDOWN

WM_KEYUP

WM_SYSKEYDOWN

WM_SYSKEYUP

Hook

Informazioni su Hook