Panoramica dell'input da tastiera
Le applicazioni devono accettare l'input dell'utente dalla tastiera e dal mouse. Un'applicazione riceve l'input da tastiera sotto forma di messaggi inviati alle relative finestre.
Modello di input da tastiera
Il sistema fornisce il supporto della tastiera indipendente dal dispositivo per le applicazioni installando un driver di dispositivo da tastiera appropriato per la tastiera corrente. Il sistema fornisce il supporto della tastiera indipendente dalla lingua usando il layout di tastiera specifico della lingua attualmente selezionato dall'utente o dall'applicazione. Il driver del dispositivo da tastiera riceve i codici di analisi dalla tastiera, che vengono inviati al layout della tastiera in cui vengono convertiti in messaggi e inviati alle finestre appropriate nell'applicazione.
Assegnato a ogni tasto su una tastiera è un valore univoco denominato codice di analisi, un identificatore dipendente dal dispositivo per il tasto sulla tastiera. Una tastiera genera due codici di analisi quando l'utente digita un tasto, uno quando l'utente preme il tasto e un altro quando l'utente rilascia il tasto.
Il driver di dispositivo da tastiera interpreta un codice di analisi e lo converte (mappa) in un codice di chiave virtuale, un valore indipendente dal dispositivo definito dal sistema che identifica lo scopo di un tasto. Dopo aver tradotto un codice di analisi, il layout della tastiera crea un messaggio che include il codice di analisi, il codice della chiave virtuale e altre informazioni sulla sequenza di tasti e quindi inserisce il messaggio nella coda dei messaggi di sistema. Il sistema rimuove il messaggio dalla coda dei messaggi di sistema e lo inserisce nella coda di messaggi del thread appropriato. Infine, il ciclo di messaggi del thread rimuove il messaggio e lo passa alla procedura di finestra appropriata per l'elaborazione. La figura seguente illustra il modello di input della tastiera.
Attivazione e stato attivo della tastiera
Il sistema inserisce i messaggi della tastiera nella coda di messaggi del thread in primo piano che ha creato la finestra con lo stato attivo della tastiera. Lo stato attivo della tastiera è una proprietà temporanea di una finestra. Il sistema condivide la tastiera tra tutte le finestre sullo schermo spostando lo stato attivo della tastiera, in direzione dell'utente, da una finestra a un'altra. La finestra con lo stato attivo della tastiera riceve (dalla coda di messaggi del thread che lo ha creato) tutti i messaggi della tastiera fino a quando lo stato attivo non cambia in una finestra diversa.
Un thread può chiamare la funzione GetFocus per determinare quale delle finestre (se presenti) ha attualmente lo stato attivo della tastiera. Un thread può assegnare lo stato attivo della tastiera a una delle relative finestre chiamando la funzione SetFocus . Quando lo stato attivo della tastiera passa da una finestra a un'altra, il sistema invia un messaggio WM_KILLFOCUS alla finestra che ha perso lo stato attivo e quindi invia un messaggio WM_edizione Standard TFOCUS alla finestra che ha ottenuto lo stato attivo.
Il concetto di stato attivo della tastiera è correlato a quello della finestra attiva. La finestra attiva è la finestra di primo livello con cui l'utente sta attualmente lavorando. La finestra con lo stato attivo della tastiera è la finestra attiva o una finestra figlio della finestra attiva. Per aiutare l'utente a identificare la finestra attiva, il sistema lo inserisce nella parte superiore dell'ordine Z e ne evidenzia la barra del titolo (se presente) e il bordo.
L'utente può attivare una finestra di primo livello facendo clic su di essa, selezionandola usando la combinazione di tasti ALT+TAB o ALT+ESC oppure selezionandola dall'elenco attività. Un thread può attivare una finestra di primo livello usando la funzione SetActiveWindow. Può determinare se una finestra di primo livello creata è attiva usando la funzione GetActiveWindow.
Quando una finestra viene disattivata e un'altra attivata, il sistema invia il messaggio di WM_ACTIVATE . La parola in ordine basso del parametro wParam è zero se la finestra viene disattivata e diversa da zero se viene attivata. Quando la routine della finestra predefinita riceve il messaggio WM_ACTIVATE , imposta lo stato attivo della tastiera sulla finestra attiva.
Per bloccare gli eventi di input della tastiera e del mouse dal raggiungimento delle applicazioni, usare BlockInput. Si noti che la funzione BlockInput non interferisce con la tabella dello stato di input della tastiera asincrona. Ciò significa che la chiamata alla funzione SendInput mentre l'input è bloccato modificherà la tabella dello stato di input della tastiera asincrona.
Messaggi di sequenza di tasti
Se si preme un tasto, un WM_KEYDOWN o WM_SYSKEYDOWN messaggio viene inserito nella coda dei messaggi del thread collegata alla finestra con lo stato attivo della tastiera. Il rilascio di una chiave determina l'inserimento di un messaggio WM_KEYUP o WM_SYSKEYUP nella coda.
I messaggi key-up e key-down si verificano in genere in coppie, ma se l'utente tiene premuto un tasto abbastanza a lungo per avviare la funzionalità di ripetizione automatica della tastiera, il sistema genera un numero di WM_KEYDOWN o WM_SYSKEYDOWN messaggi in una riga. Genera quindi un singolo messaggio WM_KEYUP o WM_SYSKEYUP quando l'utente rilascia la chiave.
Questa sezione contiene gli argomenti seguenti:
- Sequenze di tasti di sistema e non di sistema
- Codici di chiave virtuale descritti
- Flag messaggio di sequenza di tasti
Sequenze di tasti di sistema e non di sistema
Il sistema distingue le sequenze di tasti di sistema e le sequenze di tasti non di sistema. Le sequenze di tasti di sistema producono messaggi di sequenza di tasti di sistema, WM_SYSKEYDOWN e WM_SYSKEYUP. Le sequenze di tasti non di sistema producono messaggi di sequenza di tasti non di sistema, WM_KEYDOWN e WM_KEYUP.
Se la routine della finestra deve elaborare un messaggio di sequenza di tasti di sistema, assicurarsi che dopo l'elaborazione del messaggio la routine lo passi alla funzione DefWindowProc. In caso contrario, tutte le operazioni di sistema che coinvolgono il tasto ALT verranno disabilitate ogni volta che la finestra ha lo stato attivo della tastiera. Ovvero, l'utente non sarà in grado di accedere ai menu o al menu di sistema della finestra oppure di utilizzare la combinazione di tasti ALT+ESC o ALT+TAB per attivare una finestra diversa.
I messaggi di sequenza di tasti di sistema vengono usati principalmente dal sistema anziché da un'applicazione. Il sistema li usa per fornire l'interfaccia della tastiera predefinita ai menu e per consentire all'utente di controllare quale finestra è attiva. I messaggi di tastiera di sistema vengono generati quando l'utente digita un tasto in combinazione con il tasto ALT o quando l'utente digita e nessuna finestra ha lo stato attivo della tastiera, ad esempio quando l'applicazione attiva viene ridotta a icona. In questo caso, i messaggi vengono inseriti nella coda di messaggi collegata alla finestra attiva.
I messaggi di sequenza di tasti non di sistema sono usati dalle finestre dell'applicazione; la funzione DefWindowProc non esegue alcuna operazione con esse. Una procedura di finestra può eliminare qualsiasi messaggio di sequenza di tasti non di sistema che non è necessario.
Codici di chiave virtuale descritti
Il parametro wParam di un messaggio di sequenza di tasti contiene il codice del tasto virtuale del tasto premuto o rilasciato. Una routine finestra elabora o ignora un messaggio di sequenza di tasti, a seconda del valore del codice della chiave virtuale.
Una routine finestra tipica elabora solo un piccolo sottoinsieme dei messaggi di sequenza di tasti ricevuti e ignora il resto. Ad esempio, una routine finestra potrebbe elaborare solo WM_KEYDOWN messaggi di sequenza di tasti e solo quelli che contengono codici di tasto virtuale per i tasti di spostamento del cursore, i tasti di spostamento (detti anche tasti di controllo) e i tasti funzione. Una routine di finestra tipica non elabora i messaggi di sequenza di tasti dai tasti di scelta rapida. Usa invece la funzione TranslateMessage per convertire il messaggio in messaggi di tipo carattere. Per altre informazioni sui messaggi TranslateMessage e carattere, vedere Messaggi di carattere.
Flag messaggio di sequenza di tasti
Il parametro lParam di un messaggio di sequenza di tasti contiene informazioni aggiuntive sulla sequenza di tasti che ha generato il messaggio. Queste informazioni includono il numero di ripetizioni, il codice di analisi, il flag di chiave estesa, il codice di contesto, il flag di stato chiave precedente e il flag di transizione. La figura seguente mostra i percorsi di questi flag e valori nel parametro lParam .
Un'applicazione può usare i valori seguenti per ottenere i flag di sequenza di tasti da parole di ordine elevato di lParam.
Valore | Descrizione |
---|---|
KF_EXTENDED 0x0100 |
Modifica il flag di chiave esteso. |
KF_DLGMODE 0x0800 |
Modifica il flag della modalità di dialogo, che indica se una finestra di dialogo è attiva. |
KF_MENUMODE 0x1000 |
Modifica il flag modalità menu, che indica se un menu è attivo. |
KF_ALTDOWN 0x2000 |
Modifica il flag del codice di contesto. |
KF_REPEAT 0x4000 |
Modifica il flag di stato della chiave precedente. |
KF_UP 0x8000 |
Modifica il flag di stato di transizione. |
Codice di esempio:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
{
WORD vkCode = LOWORD(wParam); // virtual-key code
WORD keyFlags = HIWORD(lParam);
WORD scanCode = LOBYTE(keyFlags); // scan code
BOOL isExtendedKey = (keyFlags & KF_EXTENDED) == KF_EXTENDED; // extended-key flag, 1 if scancode has 0xE0 prefix
if (isExtendedKey)
scanCode = MAKEWORD(scanCode, 0xE0);
BOOL wasKeyDown = (keyFlags & KF_REPEAT) == KF_REPEAT; // previous key-state flag, 1 on autorepeat
WORD repeatCount = LOWORD(lParam); // repeat count, > 0 if several keydown messages was combined into one message
BOOL isKeyReleased = (keyFlags & KF_UP) == KF_UP; // transition-state flag, 1 on keyup
// if we want to distinguish these keys:
switch (vkCode)
{
case VK_SHIFT: // converts to VK_LSHIFT or VK_RSHIFT
case VK_CONTROL: // converts to VK_LCONTROL or VK_RCONTROL
case VK_MENU: // converts to VK_LMENU or VK_RMENU
vkCode = LOWORD(MapVirtualKeyW(scanCode, MAPVK_VSC_TO_VK_EX));
break;
}
// ...
}
break;
Ripeti conteggio
È possibile controllare il numero di ripetizioni per determinare se un messaggio di sequenza di tasti rappresenta più di una sequenza di tasti. Il sistema incrementa il conteggio quando la tastiera genera WM_KEYDOWN o WM_SYSKEYDOWN messaggi più velocemente di quanto un'applicazione possa elaborarli. Questo spesso si verifica quando l'utente tiene premuto un tasto abbastanza a lungo per avviare la funzionalità di ripetizione automatica della tastiera. Invece di riempire la coda dei messaggi di sistema con i messaggi chiave-down risultanti, il sistema combina i messaggi in un singolo messaggio di chiave verso il basso e incrementa il numero di ripetizioni. Il rilascio di una chiave non può avviare la funzionalità di ripetizione automatica, quindi il numero di ripetizioni per WM_KEYUP e WM_SYSKEYUP messaggi è sempre impostato su 1.
Codici di analisi
Il codice di analisi è il valore generato dal sistema quando l'utente preme un tasto. Si tratta di un valore che identifica il tasto premuto indipendentemente dal layout di tastiera attivo, anziché il carattere rappresentato dal tasto. Un'applicazione in genere ignora i codici di analisi. Usa invece i codici di chiave virtuale per interpretare i messaggi di sequenza di tasti.
Le tastiere moderne usano la specifica HID (Human Interface Devices) per comunicare con un computer. Il driver della tastiera converte i valori di utilizzo HID segnalati inviati dalla tastiera ai codici di analisi e li passa alle applicazioni.
Nota
Anche se i codici chiave virtuale sono in genere più utili per le applicazioni desktop, i codici di analisi potrebbero essere necessari in casi specifici quando è necessario sapere quale tasto viene premuto indipendentemente dal layout di tastiera corrente. Ad esempio, i tasti WASD (W è su, A è a sinistra, S è giù e D è destro) per i giochi, che garantiscono una formazione di tasti coerente tra i layout della tastiera QWERTY o francese AZERTY .
La tabella seguente elenca il set di codici di analisi attualmente riconosciuti da Windows. I valori HID Usage ID HID/Usage NAME della pagina/HID Usage Name fanno riferimento al documento HiD Usage Tables (Tabelle di utilizzo HID). I valori di Posizione chiave fanno riferimento all'immagine della tastiera precedente.
Il codice make scan 1 viene recapitato in WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN WM_SYSKEYUP/ e WM_INPUT messaggi.
Nome pagina utilizzo HID | Nome utilizzo HID | Pagina utilizzo HID | ID utilizzo HID | Scan 1 Make | Percorso chiave |
---|---|---|---|---|---|
Desktop generico | Alimentazione di sistema inattiva | 0x0001 | 0x0081 | 0xE05E | |
Desktop generico | Sospensione del sistema | 0x0001 | 0x0082 | 0xE05F | |
Desktop generico | Riattivazione del sistema | 0x0001 | 0x0083 | 0xE063 | |
Tastiera/Tastierino | ErrorRollOver | 0x0007 | 0x0001 | 0x00FF | |
Tastiera/Tastierino | Tastiera A | 0x0007 | 0x0004 | 0x001E | 31 |
Tastiera/Tastierino | Tastiera B | 0x0007 | 0x0005 | 0x0030 | 50 |
Tastiera/Tastierino | Tastiera C | 0x0007 | 0x0006 | 0x002E | 48 |
Tastiera/Tastierino | Tastiera D | 0x0007 | 0x0007 | 0x0020 | 33 |
Tastiera/Tastierino | Tastiera E | 0x0007 | 0x0008 | 0x0012 | 19 |
Tastiera/Tastierino | Tastiera F | 0x0007 | 0x0009 | 0x0021 | 34 |
Tastiera/Tastierino | Tastiera G | 0x0007 | 0x000A | 0x0022 | 35 |
Tastiera/Tastierino | Tastiera H | 0x0007 | 0x000B | 0x0023 | 36 |
Tastiera/Tastierino | Tastiera I | 0x0007 | 0x000C | 0x0017 | 24 |
Tastiera/Tastierino | Tastiera J | 0x0007 | 0x000D | 0x0024 | 37 |
Tastiera/Tastierino | Tastiera K | 0x0007 | 0x000E | 0x0025 | 38 |
Tastiera/Tastierino | Tastiera L | 0x0007 | 0x000F | 0x0026 | 39 |
Tastiera/Tastierino | Tastiera M | 0x0007 | 0x0010 | 0x0032 | 52 |
Tastiera/Tastierino | Tastiera N | 0x0007 | 0x0011 | 0x0031 | 51 |
Tastiera/Tastierino | Tastiera O | 0x0007 | 0x0012 | 0x0018 | 25 |
Tastiera/Tastierino | Tastiera P | 0x0007 | 0x0013 | 0x0019 | 26 |
Tastiera/Tastierino | Tastiera Q | 0x0007 | 0x0014 | 0x0010 | 17 |
Tastiera/Tastierino | Tastiera R | 0x0007 | 0x0015 | 0x0013 | 20 |
Tastiera/Tastierino | Tastiera S | 0x0007 | 0x0016 | 0x001F | 32 |
Tastiera/Tastierino | Tastiera T | 0x0007 | 0x0017 | 0x0014 | 21 |
Tastiera/Tastierino | Tastiera U | 0x0007 | 0x0018 | 0x0016 | 23 |
Tastiera/Tastierino | Tastiera V | 0x0007 | 0x0019 | 0x002F | 49 |
Tastiera/Tastierino | Tastiera W | 0x0007 | 0x001A | 0x0011 | 18 |
Tastiera/Tastierino | Tastiera X | 0x0007 | 0x001B | 0x002D | 47 |
Tastiera/Tastierino | Y tastiera | 0x0007 | 0x001C | 0x0015 | 22 |
Tastiera/Tastierino | Tastiera Z | 0x0007 | 0x001D | 0x002C | 46 |
Tastiera/Tastierino | Tastiera 1 e Bang | 0x0007 | 0x001E | 0x0002 | 2 |
Tastiera/Tastierino | Tastiera 2 e At | 0x0007 | 0x001F | 0x0003 | 3 |
Tastiera/Tastierino | Tastiera 3 e hash | 0x0007 | 0x0020 | 0x0004 | 4 |
Tastiera/Tastierino | Tastiera 4 e Dollaro | 0x0007 | 0x0021 | 0x0005 | 5 |
Tastiera/Tastierino | Tastiera 5 e percentuale | 0x0007 | 0x0022 | 0x0006 | 6 |
Tastiera/Tastierino | Tastiera 6 e cursore | 0x0007 | 0x0023 | 0x0007 | 7 |
Tastiera/Tastierino | Tastiera 7 e E commerciale | 0x0007 | 0x0024 | 0x0008 | 8 |
Tastiera/Tastierino | Tastiera 8 e Stella | 0x0007 | 0x0025 | 0x0009 | 9 |
Tastiera/Tastierino | Tastiera 9 e parentesi quadra sinistra | 0x0007 | 0x0026 | 0x000A | 10 |
Tastiera/Tastierino | Tastiera 0 e parentesi destra | 0x0007 | 0x0027 | 0x000B | 11 |
Tastiera/Tastierino | Invio tastiera | 0x0007 | 0x0028 | 0x001C | 43 |
Tastiera/Tastierino | Escape da tastiera | 0x0007 | 0x0029 | 0x0001 | 110 |
Tastiera/Tastierino | Eliminazione da tastiera | 0x0007 | 0x002A | 0x000E | 15 |
Tastiera/Tastierino | Scheda Tastiera | 0x0007 | 0x002B | 0x000F | 16 |
Tastiera/Tastierino | Barra spaziatrice della tastiera | 0x0007 | 0x002C | 0x0039 | 61 |
Tastiera/Tastierino | Trattino da tastiera e sottolineatura | 0x0007 | 0x002D | 0x000C | 12 |
Tastiera/Tastierino | Tastiera uguale a e più | 0x0007 | 0x002E | 0x000D | 13 |
Tastiera/Tastierino | Parentesi graffa sinistra tastiera | 0x0007 | 0x002F | 0x001A | 27 |
Tastiera/Tastierino | Parentesi graffa destra tastiera | 0x0007 | 0x0030 | 0x001B | 28 |
Tastiera/Tastierino | Barra e barra da tastiera | 0x0007 | 0x0031 | 0x002B | 29 |
Tastiera/Tastierino | Tastiera non USA | 0x0007 | 0x0032 | 0x002B | 42 |
Tastiera/Tastierino | Punto e virgola tastiera e due punti | 0x0007 | 0x0033 | 0x0027 | 40 |
Tastiera/Tastierino | Apostrofo tastiera e virgolette doppie | 0x0007 | 0x0034 | 0x0028 | 41 |
Tastiera/Tastierino | Accento tastiera grave e tilde | 0x0007 | 0x0035 | 0x0029 | 1 |
Tastiera/Tastierino | Virgola tastiera | 0x0007 | 0x0036 | 0x0033 | 53 |
Tastiera/Tastierino | Punto tastiera | 0x0007 | 0x0037 | 0x0034 | 54 |
Tastiera/Tastierino | Punto interrogativo della tastiera | 0x0007 | 0x0038 | 0x0035 | 55 |
Tastiera/Tastierino | Bloc maiuscole tastiera | 0x0007 | 0x0039 | 0x003A | 30 |
Tastiera/Tastierino | F1 tastiera | 0x0007 | 0x003A | 0x003B | 112 |
Tastiera/Tastierino | Tastiera F2 | 0x0007 | 0x003B | 0x003C | 113 |
Tastiera/Tastierino | Tastiera F3 | 0x0007 | 0x003C | 0x003D | 114 |
Tastiera/Tastierino | F4 della tastiera | 0x0007 | 0x003D | 0x003E | 115 |
Tastiera/Tastierino | Tastiera F5 | 0x0007 | 0x003E | 0x003F | 116 |
Tastiera/Tastierino | F6 della tastiera | 0x0007 | 0x003F | 0x0040 | 117 |
Tastiera/Tastierino | Tastiera F7 | 0x0007 | 0x0040 | 0x0041 | 118 |
Tastiera/Tastierino | F8 della tastiera | 0x0007 | 0x0041 | 0x0042 | 119 |
Tastiera/Tastierino | Tastiera F9 | 0x0007 | 0x0042 | 0x0043 | 120 |
Tastiera/Tastierino | F10 della tastiera | 0x0007 | 0x0043 | 0x0044 | 121 |
Tastiera/Tastierino | F11 da tastiera | 0x0007 | 0x0044 | 0x0057 | 122 |
Tastiera/Tastierino | F12 da tastiera | 0x0007 | 0x0045 | 0x0058 | 123 |
Tastiera/Tastierino | Tastiera PrintScreen | 0x0007 | 0x0046 | 0xE037 0x0054 *Nota 1 |
124 |
Tastiera/Tastierino | Blocco scorrimento tastiera | 0x0007 | 0x0047 | 0x0046 | 125 |
Tastiera/Tastierino | Pausa tastiera | 0x0007 | 0x0048 | 0xE11D45 0xE046 *Nota 2 0x0045 *Nota 3 |
126 |
Tastiera/Tastierino | Inserimento tastiera | 0x0007 | 0x0049 | 0xE052 | 75 |
Tastiera/Tastierino | Home page della tastiera | 0x0007 | 0x004A | 0xE047 | 80 |
Tastiera/Tastierino | PageUp della tastiera | 0x0007 | 0x004B | 0xE049 | 85 |
Tastiera/Tastierino | Elimina tastiera in avanti | 0x0007 | 0x004C | 0xE053 | 76 |
Tastiera/Tastierino | Fine tastiera | 0x0007 | 0x004D | 0xE04F | 81 |
Tastiera/Tastierino | Tastiera PageDown | 0x0007 | 0x004E | 0xE051 | 86 |
Tastiera/Tastierino | Tastiera RightArrow | 0x0007 | 0x004F | 0xE04D | 89 |
Tastiera/Tastierino | Tastiera LeftArrow | 0x0007 | 0x0050 | 0xE04B | 79 |
Tastiera/Tastierino | Tastiera giùArrow | 0x0007 | 0x0051 | 0xE050 | 84 |
Tastiera/Tastierino | UpArrow della tastiera | 0x0007 | 0x0052 | 0xE048 | 83 |
Tastiera/Tastierino | Blocco num num del tastierino e cancella | 0x0007 | 0x0053 | 0x0045 0xE045 *Nota 3 |
90 |
Tastiera/Tastierino | Barra del tastierino | 0x0007 | 0x0054 | 0xE035 | 95 |
Tastiera/Tastierino | Stella del tastierino | 0x0007 | 0x0055 | 0x0037 | 100 |
Tastiera/Tastierino | Trattino del tastierino | 0x0007 | 0x0056 | 0x004A | 105 |
Tastiera/Tastierino | Tastierino più | 0x0007 | 0x0057 | 0x004E | 106 |
Tastiera/Tastierino | INVIO del tastierino | 0x0007 | 0x0058 | 0xE01C | 108 |
Tastiera/Tastierino | Tastierino 1 e fine | 0x0007 | 0x0059 | 0x004F | 93 |
Tastiera/Tastierino | Tastierino 2 e freccia giù | 0x0007 | 0x005A | 0x0050 | 98 |
Tastiera/Tastierino | Tastierino 3 e PageDn | 0x0007 | 0x005B | 0x0051 | 103 |
Tastiera/Tastierino | Tastierino 4 e freccia sinistra | 0x0007 | 0x005C | 0x004B | 92 |
Tastiera/Tastierino | Tastierino 5 | 0x0007 | 0x005D | 0x004C | 97 |
Tastiera/Tastierino | Tastierino 6 e freccia destra | 0x0007 | 0x005E | 0x004D | 102 |
Tastiera/Tastierino | Tastierino 7 e Home | 0x0007 | 0x005F | 0x0047 | 91 |
Tastiera/Tastierino | Tastierino 8 e freccia su | 0x0007 | 0x0060 | 0x0048 | 96 |
Tastiera/Tastierino | Tastierino 9 e PageUp | 0x0007 | 0x0061 | 0x0049 | 101 |
Tastiera/Tastierino | Tastierino 0 e Inserisci | 0x0007 | 0x0062 | 0x0052 | 99 |
Tastiera/Tastierino | Periodo del tastierino | 0x0007 | 0x0063 | 0x0053 | 104 |
Tastiera/Tastierino | Barra barra barra tastiera non USA | 0x0007 | 0x0064 | 0x0056 | 45 |
Tastiera/Tastierino | Applicazione tastiera | 0x0007 | 0x0065 | 0xE05D | 129 |
Tastiera/Tastierino | Alimentazione da tastiera | 0x0007 | 0x0066 | 0xE05E | |
Tastiera/Tastierino | Tastierino uguale a | 0x0007 | 0x0067 | 0x0059 | |
Tastiera/Tastierino | F13 della tastiera | 0x0007 | 0x0068 | 0x0064 | |
Tastiera/Tastierino | F14 da tastiera | 0x0007 | 0x0069 | 0x0065 | |
Tastiera/Tastierino | F15 da tastiera | 0x0007 | 0x006A | 0x0066 | |
Tastiera/Tastierino | F16 da tastiera | 0x0007 | 0x006B | 0x0067 | |
Tastiera/Tastierino | F17 della tastiera | 0x0007 | 0x006C | 0x0068 | |
Tastiera/Tastierino | F18 da tastiera | 0x0007 | 0x006D | 0x0069 | |
Tastiera/Tastierino | F19 da tastiera | 0x0007 | 0x006E | 0x006A | |
Tastiera/Tastierino | F20 della tastiera | 0x0007 | 0x006F | 0x006B | |
Tastiera/Tastierino | F21 da tastiera | 0x0007 | 0x0070 | 0x006C | |
Tastiera/Tastierino | Tastiera F22 | 0x0007 | 0x0071 | 0x006D | |
Tastiera/Tastierino | Tastiera F23 | 0x0007 | 0x0072 | 0x006E | |
Tastiera/Tastierino | Tastiera F24 | 0x0007 | 0x0073 | 0x0076 | |
Tastiera/Tastierino | Virgola del tastierino | 0x0007 | 0x0085 | 0x007E | 107 *Nota 4 |
Tastiera/Tastierino | Keyboard International1 | 0x0007 | 0x0087 | 0x0073 | 56 *Nota 4, 5 |
Tastiera/Tastierino | Keyboard International2 | 0x0007 | 0x0088 | 0x0070 | 133 *Nota 5 |
Tastiera/Tastierino | Keyboard International3 | 0x0007 | 0x0089 | 0x007D | 14 *Nota 5 |
Tastiera/Tastierino | Tastiera Internazionale4 | 0x0007 | 0x008A | 0x0079 | 132 *Nota 5 |
Tastiera/Tastierino | Keyboard International5 | 0x0007 | 0x008B | 0x007B | 131 *Nota 5 |
Tastiera/Tastierino | Keyboard International6 | 0x0007 | 0x008C | 0x005C | |
Tastiera/Tastierino | Tastiera LANG1 | 0x0007 | 0x0090 | 0x0072 *Nota 6 0x00F2 *Nota 3, 6 |
|
Tastiera/Tastierino | Tastiera LANG2 | 0x0007 | 0x0091 | 0x0071 *Nota 6 0x00F1 *Nota 3, 6 |
|
Tastiera/Tastierino | Tastiera LANG3 | 0x0007 | 0x0092 | 0x0078 | |
Tastiera/Tastierino | Tastiera LANG4 | 0x0007 | 0x0093 | 0x0077 | |
Tastiera/Tastierino | Tastiera LANG5 | 0x0007 | 0x0094 | 0x0076 | |
Tastiera/Tastierino | Tastiera LeftControl | 0x0007 | 0x00E0 | 0x001D | 58 |
Tastiera/Tastierino | Tastiera LeftShift | 0x0007 | 0x00E1 | 0x002A | 44 |
Tastiera/Tastierino | Tastiera LeftAlt | 0x0007 | 0x00E2 | 0x0038 | 60 |
Tastiera/Tastierino | GUI a sinistra della tastiera | 0x0007 | 0x00E3 | 0xE05B | 127 |
Tastiera/Tastierino | Tastiera RightControl | 0x0007 | 0x00E4 | 0xE01D | 64 |
Tastiera/Tastierino | Tastiera RightShift | 0x0007 | 0x00E5 | 0x0036 | 57 |
Tastiera/Tastierino | Tastiera A destra | 0x0007 | 0x00E6 | 0xE038 | 62 |
Tastiera/Tastierino | GUI a destra della tastiera | 0x0007 | 0x00E7 | 0xE05C | 128 |
Consumer | Analisi traccia successiva | 0x000C | 0x00B5 | 0xE019 | |
Consumer | Analizza traccia precedente | 0x000C | 0x00B6 | 0xE010 | |
Consumer | Arresta | 0x000C | 0x00B7 | 0xE024 | |
Consumer | Play/Pausa | 0x000C | 0x00CD | 0xE022 | |
Consumer | Disattiva audio | 0x000C | 0x00E2 | 0xE020 | |
Consumer | Incremento del volume | 0x000C | 0x00E9 | 0xE030 | |
Consumer | Decremento del volume | 0x000C | 0x00EA | 0xE02E | |
Consumer | Configurazione del controllo consumer AL | 0x000C | 0x0183 | 0xE06D | |
Consumer | Lettore di posta elettronica AL | 0x000C | 0x018A | 0xE06C | |
Consumer | Calcolatore AL | 0x000C | 0x0192 | 0xE021 | |
Consumer | Browser computer locale AL | 0x000C | 0x0194 | 0xE06B | |
Consumer | Ricerca AC | 0x000C | 0x0221 | 0xE065 | |
Consumer | AC Home | 0x000C | 0x0223 | 0xE032 | |
Consumer | Ac Indietro | 0x000C | 0x0224 | 0xE06A | |
Consumer | Avanti AC | 0x000C | 0x0225 | 0xE069 | |
Consumer | Arresto AC | 0x000C | 0x0226 | 0xE068 | |
Consumer | Aggiornamento AC | 0x000C | 0x0227 | 0xE067 | |
Consumer | Segnalibri AC | 0x000C | 0x022A | 0xE066 |
Note:
- Il codice di analisi della chiave SysRq viene generato nella sequenza di tasti ALT+Stampa schermo
- Il codice di analisi della chiave di interruzione viene generato nella sequenza di tasti Control+Pause
- Come illustrato nei messaggi di tastiera legacy
- Il tasto è presente sulle tastiere brasiliane
- Il tasto è presente nelle tastiere giapponesi
- Il codice di analisi viene generato solo nell'evento di rilascio della chiave
Flag chiave estesa
Il flag di tasti esteso indica se il messaggio di tastiera ha avuto origine da uno dei tasti aggiuntivi nella tastiera avanzata 101/102. I tasti estesi sono costituiti dai tasti ALT e CTRL sul lato destro della tastiera; i tasti INS, DEL, HOME, END, PAGE UP, PAGE DOWN e freccia nei cluster a sinistra del tastierino numerico; il tasto BLOC NUM; il tasto BREAK (CTRL+PAU edizione Standard), il tasto PRINT SCRN e i tasti di divisione (/) e INVIO nel tastierino numerico. Il tasto MAIUSC a destra non è considerato un tasto esteso, ma ha un codice di analisi separato.
Se specificato, il codice di analisi è costituito da una sequenza di due byte, in cui il primo byte ha un valore di 0xE0.
Codice di contesto
Il codice di contesto indica se il tasto ALT è inattivo quando è stato generato il messaggio di sequenza di tasti. Il codice è 1 se il tasto ALT era inattivo e 0 se era inattivo.
Flag stato chiave precedente
Il flag di stato della chiave precedente indica se la chiave che ha generato il messaggio di sequenza di tasti è stata precedentemente alzata o inattiva. È 1 se la chiave era precedentemente inattiva e 0 se la chiave era in precedenza su. È possibile usare questo flag per identificare i messaggi di sequenza di tasti generati dalla funzionalità di ripetizione automatica della tastiera. Questo flag è impostato su 1 per WM_KEYDOWN e WM_SYSKEYDOWN messaggi di sequenza di tasti generati dalla funzionalità di ripetizione automatica. È sempre impostato su 1 per i messaggi WM_KEYUP e WM_SYSKEYUP.
Flag di transizione
Il flag di stato di transizione indica se premere un tasto o rilasciare un tasto ha generato il messaggio di sequenza di tasti. Questo flag è sempre impostato su 0 per i messaggi WM_KEYDOWN e WM_SYSKEYDOWN; è sempre impostato su 1 per i messaggi WM_KEYUP e WM_SYSKEYUP.
Messaggi di carattere
I messaggi di sequenza di tasti forniscono molte informazioni sulle sequenze di tasti, ma non forniscono codici carattere per le sequenze di tasti. Per recuperare i codici carattere, un'applicazione deve includere la funzione TranslateMessage nel ciclo di messaggi del thread. TranslateMessage passa un messaggio WM_KEYDOWN o WM_SYSKEYDOWN al layout della tastiera. Il layout esamina il codice della chiave virtuale del messaggio e, se corrisponde a una chiave di carattere, fornisce l'equivalente del codice carattere (tenendo conto dello stato dei tasti MAIUSC e C piattaforma di strumenti analitici LOCK). Genera quindi un messaggio di carattere che include il codice carattere e inserisce il messaggio nella parte superiore della coda di messaggi. L'iterazione successiva del ciclo di messaggi rimuove il messaggio di carattere dalla coda e invia il messaggio alla procedura di finestra appropriata.
Questa sezione contiene gli argomenti seguenti:
Messaggi carattere non di sistema
Una routine finestra può ricevere i messaggi di carattere seguenti: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHAR e WM_UNICHAR. La funzione TranslateMessage genera un messaggio WM_CHAR o WM_DEADCHAR quando elabora un messaggio WM_KEYDOWN. Analogamente, genera un messaggio di WM_SYSCHAR o WM_SYSDEADCHAR quando elabora un messaggio di WM_SYSKEYDOWN.
Un'applicazione che elabora l'input da tastiera ignora in genere tutti i messaggi WM_CHAR e WM_UNICHAR, passando qualsiasi altro messaggio alla funzione DefWindowProc. Si noti che WM_CHAR usa UTF-16 (formato di trasformazione Unicode a 16 bit) o un set di caratteri ANSI mentre WM_UNICHAR usa sempre UTF-32 (formato di trasformazione Unicode a 32 bit). Il sistema usa i messaggi WM_SYSCHAR e WM_SYSDEADCHAR per implementare i mnemonic del menu.
Il parametro wParam di tutti i messaggi di caratteri contiene il codice carattere del tasto carattere premuto. Il valore del codice carattere dipende dalla classe finestra della finestra che riceve il messaggio. Se la versione Unicode della funzione RegisterClass è stata usata per registrare la classe window, il sistema fornisce caratteri Unicode a tutte le finestre di tale classe. In caso contrario, il sistema fornisce codici carattere ANSI. Per altre informazioni, vedere Registrazione delle classi di finestre e Usare le tabelle codici UTF-8 nelle app di Windows.
Il contenuto del parametro lParam di un messaggio di carattere è identico al contenuto del parametro lParam del messaggio key-down convertito per produrre il messaggio di caratteri. Per informazioni, vedere Flag messaggio di sequenza di tasti.
Messaggi non recapitabili
Alcune tastiere non inglesi contengono tasti di carattere che non devono produrre caratteri da soli. Vengono invece usati per aggiungere un diacritico al carattere prodotto dalla sequenza di tasti successiva. Queste chiavi sono denominate chiavi non recapitabili. Il tasto circonflesso su una tastiera tedesca è un esempio di tasto morto. Per immettere il carattere costituito da un "o" con una circonflessa, un utente tedesco digita la chiave circonflessa seguita dalla chiave "o". La finestra con lo stato attivo della tastiera riceverà la sequenza di messaggi seguente:
TranslateMessage genera il messaggio WM_DEADCHAR quando elabora il messaggio WM_KEYDOWN da una chiave non morta. Anche se il parametro wParam del messaggio WM_DEADCHAR contiene il codice carattere del diacritico per la chiave morta, un'applicazione in genere ignora il messaggio. Elabora invece il messaggio WM_CHAR generato dalla sequenza di tasti successiva. Il parametro wParam del messaggio WM_CHAR contiene il codice carattere della lettera con il diacritico. Se la sequenza di tasti successiva genera un carattere che non può essere combinato con un diacritico, il sistema genera due messaggi WM_CHAR . Il parametro wParam del primo contiene il codice carattere del diacritico. Il parametro wParam del secondo contiene il codice carattere della chiave di carattere successiva.
La funzione TranslateMessage genera il messaggio di WM_SYSDEADCHAR quando elabora il messaggio WM_SYSKEYDOWN da un tasto non recapitabili di sistema (un tasto morto premuto in combinazione con il tasto ALT). Un'applicazione ignora in genere il messaggio di WM_SYSDEADCHAR .
Stato chiave
Durante l'elaborazione di un messaggio da tastiera, un'applicazione potrebbe dover determinare lo stato di un altro tasto oltre a quello che ha generato il messaggio corrente. Ad esempio, un'applicazione di elaborazione delle parole che consente all'utente di premere MAIUSC+END per selezionare un blocco di testo deve controllare lo stato del tasto MAIUSC ogni volta che riceve un messaggio di sequenza di tasti dal tasto END. L'applicazione può usare la funzione GetKeyState per determinare lo stato di una chiave virtuale al momento della generazione del messaggio corrente. Può usare la funzione GetAsyncKeyState per recuperare lo stato corrente di una chiave virtuale.
Il layout della tastiera mantiene un elenco di nomi. Il nome di una chiave che produce un singolo carattere corrisponde al carattere prodotto dalla chiave. Il nome di una chiave non carattere, ad esempio TAB e INVIO, viene archiviato come stringa di caratteri. Un'applicazione può recuperare il nome di qualsiasi chiave dal driver di dispositivo chiamando la funzione GetKeyNameText.
Sequenze di tasti e traduzioni di caratteri
Il sistema include diverse funzioni speciali che convertono codici di analisi, codici carattere e codici di chiave virtuale forniti da vari messaggi di sequenza di tasti. Queste funzioni includono MapVirtualKey, ToAscii, ToUnicode e VkKeyScan.
Inoltre, Microsoft Rich Edit 3.0 supporta l'IME HexToUnicode, che consente a un utente di eseguire la conversione tra caratteri esadecimali e Unicode usando i tasti di scelta rapida. Ciò significa che quando Microsoft Rich Edit 3.0 viene incorporato in un'applicazione, l'applicazione erediterà le funzionalità dell'IME hexToUnicode.
Supporto di tasti di scelta rapida
Un tasto di scelta rapida è una combinazione di tasti che genera un messaggio WM_HOTKEY , un messaggio che il sistema posiziona nella parte superiore della coda dei messaggi di un thread, ignorando eventuali messaggi esistenti nella coda. Le applicazioni usano i tasti di scelta rapida per ottenere l'input della tastiera ad alta priorità dall'utente. Ad esempio, definendo un tasto di scelta rapida costituito dalla combinazione di tasti CTRL+C, un'applicazione può consentire all'utente di annullare un'operazione lunga.
Per definire un tasto di scelta rapida, un'applicazione chiama la funzione RegisterHotKey, specificando la combinazione di chiavi che genera il messaggio WM_HOTKEY, l'handle alla finestra per ricevere il messaggio e l'identificatore del tasto di scelta rapida. Quando l'utente preme il tasto di scelta rapida, un messaggio di WM_HOTKEY viene inserito nella coda di messaggi del thread che ha creato la finestra. Il parametro wParam del messaggio contiene l'identificatore della chiave di scelta rapida. L'applicazione può definire più tasti di scelta rapida per un thread, ma ogni tasto di scelta rapida nel thread deve avere un identificatore univoco. Prima che l'applicazione termini, deve usare la funzione UnregisterHotKey per eliminare definitivamente il tasto di scelta rapida.
Le applicazioni possono usare un controllo tasto di scelta rapida per semplificare la scelta di un tasto di scelta rapida da parte dell'utente. I controlli tasto di scelta rapida vengono in genere usati per definire un tasto di scelta rapida che attiva una finestra; non usano le funzioni RegisterHotKey e UnregisterHotKey. Al contrario, un'applicazione che usa un controllo tasto di scelta rapida invia in genere il messaggio WM_edizione Standard THOTKEY per impostare il tasto di scelta rapida. Ogni volta che l'utente preme il tasto di scelta rapida, il sistema invia un messaggio di WM_SYSCOMMAND che specifica SC_HOTKEY. Per altre informazioni sui controlli con tasti di scelta rapida, vedere "Uso di controlli tasto di scelta rapida" in Controlli a tasti di scelta rapida.
Tasti da tastiera per l'esplorazione e altre funzioni
Windows offre supporto per le tastiere con tasti speciali per funzioni del browser, funzioni multimediali, avvio delle applicazioni e risparmio energia. Il WM_APPCOMMAND supporta i tasti aggiuntivi della tastiera. Inoltre, la funzione ShellProc viene modificata per supportare i tasti aggiuntivi della tastiera.
È improbabile che una finestra figlio in un'applicazione componente sia in grado di implementare direttamente i comandi per questi tasti aggiuntivi. Quindi, quando viene premuto uno di questi tasti, DefWindowProc invierà un messaggio WM_APPCOMMAND a una finestra. DefWindowProc a bollerà anche il messaggio WM_APPCOMMAND nella finestra padre. Questo è simile al modo in cui i menu di scelta rapida vengono richiamati con il pulsante destro del mouse, ovvero defWindowProc invia un messaggio di WM_CONTEXTMENU su un clic con il pulsante destro del mouse e lo bolle nel relativo elemento padre. Inoltre, se DefWindowProc riceve un messaggio di WM_APPCOMMAND per una finestra di primo livello, chiamerà un hook della shell con codice HSHELL_APPCOMMAND.
Windows supporta anche Microsoft IntelliMouse Explorer, ovvero un mouse con cinque pulsanti. I due pulsanti aggiuntivi supportano lo spostamento avanti e indietro del browser. Per altre informazioni, vedere XBUTTONs.
Simulazione dell'input
Per simulare una serie ininterrotta di eventi di input utente, usare la funzione SendInput. La funzione accetta tre parametri. Il primo parametro, cInputs, indica il numero di eventi di input che verranno simulati. Il secondo parametro, rgInputs, è una matrice di strutture INPUT , ognuna che descrive un tipo di evento di input e informazioni aggiuntive su tale evento. L'ultimo parametro, cbSize, accetta le dimensioni della struttura INPUT , in byte.
La funzione SendInput funziona inserendo una serie di eventi di input simulati nel flusso di input di un dispositivo. L'effetto è simile alla chiamata ripetuta della funzione keybd_event o mouse_event, ad eccezione del fatto che il sistema garantisce che nessun altro evento di input si intermingle con gli eventi simulati. Al termine della chiamata, il valore restituito indica il numero di eventi di input riprodotti correttamente. Se questo valore è zero, l'input è stato bloccato.
La funzione SendInput non reimposta lo stato corrente della tastiera. Pertanto, se l'utente ha tasti premuti quando si chiama questa funzione, potrebbe interferire con gli eventi generati da questa funzione. Se si è preoccupati per possibili interferenze, controllare lo stato della tastiera con la funzione GetAsyncKeyState e correggere in base alle esigenze.
Lingue, impostazioni locali e layout di tastiera
Una lingua è un linguaggio naturale, ad esempio inglese, francese e giapponese. Una sottolanguage è una variante di una lingua naturale parlata in una regione geografica specifica, ad esempio le sottolanguature inglesi parlate nel Regno Unito e il Stati Uniti. Le applicazioni usano valori, denominati identificatori di lingua, per identificare in modo univoco le lingue e le sottolanguazioni.
Le applicazioni usano in genere le impostazioni locali per impostare la lingua in cui viene elaborato l'input e l'output. L'impostazione delle impostazioni locali per la tastiera, ad esempio, influisce sui valori dei caratteri generati dalla tastiera. L'impostazione delle impostazioni locali per la visualizzazione o la stampante influisce sui glifi visualizzati o stampati. Le applicazioni impostano le impostazioni locali per una tastiera caricando e usando layout di tastiera. Impostano le impostazioni locali per una visualizzazione o una stampante selezionando un tipo di carattere che supporta le impostazioni locali specificate.
Un layout della tastiera non solo specifica la posizione fisica dei tasti sulla tastiera, ma determina anche i valori dei caratteri generati premendo tali tasti. Ogni layout identifica la lingua di input corrente e determina i valori di carattere generati da quali chiavi e combinazioni di tasti.
Ogni layout di tastiera ha un handle corrispondente che identifica il layout e la lingua. La parola bassa dell'handle è un identificatore di lingua. La parola alta è un handle del dispositivo, specificando il layout fisico o è zero, che indica un layout fisico predefinito. L'utente può associare qualsiasi lingua di input a un layout fisico. Ad esempio, un utente di lingua inglese che lavora molto occasionalmente in francese può impostare la lingua di input della tastiera su francese senza modificare il layout fisico della tastiera. Ciò significa che l'utente può immettere testo in francese usando il layout inglese familiare.
Le applicazioni in genere non devono modificare direttamente i linguaggi di input. L'utente configura invece le combinazioni di linguaggio e layout, quindi passa tra di esse. Quando l'utente fa clic su testo contrassegnato con una lingua diversa, l'applicazione chiama la funzione ActivateKeyboardLayout per attivare il layout predefinito dell'utente per tale lingua. Se l'utente modifica il testo in una lingua che non è presente nell'elenco attivo, l'applicazione può chiamare la funzione LoadKeyboardLayout con la lingua per ottenere un layout basato su tale lingua.
La funzione ActivateKeyboardLayout imposta la lingua di input per l'attività corrente. Il parametro hkl può essere l'handle del layout della tastiera o un identificatore di lingua esteso zero. Gli handle di layout della tastiera possono essere ottenuti dalla funzione LoadKeyboardLayout o GetKeyboardLayoutList. I valori HKL_NEXT e HKL_PREV possono essere usati anche per selezionare la tastiera successiva o precedente.
La funzione GetKeyboardLayoutName recupera il nome del layout di tastiera attivo per il thread chiamante. Se un'applicazione crea il layout attivo usando la funzione LoadKeyboardLayout , GetKeyboardLayoutName recupera la stessa stringa usata per creare il layout. In caso contrario, la stringa è l'identificatore di lingua principale corrispondente alle impostazioni locali del layout attivo. Ciò significa che la funzione non può necessariamente distinguere tra layout diversi con la stessa lingua primaria, quindi non può restituire informazioni specifiche sulla lingua di input. La funzione GetKeyboardLayout , tuttavia, può essere usata per determinare la lingua di input.
La funzione LoadKeyboardLayout carica un layout di tastiera e rende il layout disponibile per l'utente. Le applicazioni possono rendere il layout immediatamente attivo per il thread corrente usando il valore KLF_ACTIVATE . Un'applicazione può usare il valore KLF_REORDER per riordinare i layout senza specificare anche il valore KLF_ACTIVATE . Le applicazioni devono usare sempre il valore KLF_SUBSTITUTE_OK durante il caricamento dei layout di tastiera per assicurarsi che la preferenza dell'utente, se presente, sia selezionata.
Per il supporto multilingue, la funzione LoadKeyboardLayout fornisce i flag KLF_REPLACELANG e KLF_NOTELLSHELL. Il flag KLF_REPLACELANG indirizza la funzione a sostituire un layout di tastiera esistente senza modificare la lingua. Il tentativo di sostituire un layout esistente usando lo stesso identificatore di lingua, ma senza specificare KLF_REPLACELANG è un errore. Il flag KLF_NOTELLSHELL impedisce alla funzione di notificare alla shell quando viene aggiunto o sostituito un layout di tastiera. Ciò è utile per le applicazioni che aggiungono più layout in una serie consecutiva di chiamate. Questo flag deve essere usato in tutti gli altri ma nell'ultima chiamata.
La funzione UnloadKeyboardLayout è limitata in quanto non può scaricare la lingua di input predefinita del sistema. In questo modo, l'utente dispone sempre di un layout disponibile per immettere testo usando lo stesso set di caratteri usato dalla shell e dal file system.