Una nota riguardo agli ultimi sei codici (VK_LSHIFT, VK_RSHIFT,
VK_LCONTROL, VK_RCONTROL, VK_LMENU, VK_RMENU) della lista dei codici
tasti virtuale della lista presente nella puntata precedente, è
che le varianti left e right (VK_L e VK_R) sono usati solo come
parametri delle funzioni GetAsyncKeyState() e GetKeyState().
Non c'è nessuna altra funzione standard o dell'API che può distinguere
questi tasti nel modo visto.
Inoltre ci sono alcuni codici tasto virtuale che non corrispondono
ad alcun tasto delle normali tastiere a 102/105 tasti con layout
italiano. Ad esempio i codici da VK_F13 a VK_F24 sono i codici corrispondenti
ai tasti funzione F13 - F24 e che sono presenti solo in alcune tastiere
particolari.
Per finire, alla lista mancano i codici delle lettere da a a z e
da A a Z e i numeri da 0 a 9. Questi codici corrispondono biunivocamente
ai relativi codici ASCII corrispondenti.
Ricordo che i codici ASCII da a a z vanno da 97 (0x61) a 122 (0x7A),
da A a Z vanno da 65 (0x41) a 90 (0x5A), da 0 a 9 vanno da 48 (0x30)
a 57 (0x39).
Tutti i valori visti sono definiti nel file winuser.h che potete
trovare nella directory Include dove avete installato il Visual
C++.
Per i tasti che non sono compresi nella lista ( punto e virgola,
parentesi... ) si deve utilizzare il gestore OnChar per il
messaggio WM_CHAR.
Nel gestore del messaggio di tastiera vi potrebbe interessare sapere
se il tasto CTRL, MAIUSC o ALT è premuto. In questo caso sembrerebbe
ragionevole utilizzare la funzione ::GetKeyState.
Nel caso in cui vi interessi sapere qualcosa a riguardo del tasto
ALT, questa procedura è superflua perché potete utilizzare i bit
di flag del gestore.
Questa funzione, richiamata ad esempio così:
::GetKeyState(VK_CONTROL)
ritorna un valore negativo se il tasto CTRL era premuto al momento
della generazione del messaggio di tastiera, un valore diverso in
caso contrario.
In un gestore di messaggio di tastiera non vi sognate di utilizzare
la funzione ::GetAsyncKeyState, questa opera infatti in modo
asincrono ed in realtime, ritornando quindi lo stato del tasto al
momento dell'invocazione della funzione e non al momento della generazione
del messaggio di tastiera.
Potreste dire: qual'è il problema?
Il problema potrebbe essere il seguente: pensate di premere il tasto
5 e poi dopo continuare a tenere premuto il tasto MAIUSC. Nel vostro
gestore se utilizzaste ::GetKeyState(VK_SHIFT), questa ritornerebbe
un valore non negativo perché al momento di generare il messaggio
di tastiera provocato dalla pressione del tasto 5, il tasto MAIUSC
non era premuto. Se invece aveste utilizzato ::GetAsyncKeyState,
questa avrebbe ritornato un valore negativo perché dopo aver generato
il messaggio di tastiera tenevate premuto il tasto MAIUSC. Conseguenza:
se stavate implementando la logica di un Notepad, nel primo caso
avreste correttamente stampato il carattere 5, nel secondo invece
il carattere %.
Con ::GetKeyState potete recuperare anche lo stato dei pulsanti
del mouse, i loro codici di tasto virtuale sono infatti VK_LBUTTON,
VK_MBUTTON e VK_RBUTTON.
Se ad esempio vi interessa sapere se è premuto il pulsante destro
del mouse, il tasto CTRL e contemporaneamente anche il tasto F2,
potete utilizzare un enunciato del genere:
if ((::GetKeyState(VK_CTRL)<0
) && (::GetKeyState(VK_RBUTTON)<0 ) && (nChar==VK_F2))
{
// fai qualcosa
}
Se vi interessa sapere se ad esempio il tasto CAPS_LOCK è stato
premuto e la scrittura è di default in maiuscolo, potete testare
il bit di ordine più basso e vedere se è 1 (test dello stato toggled):
::GetKeyState(VK_CAPITAL) & 0x01;
Vi ricordo infatti, come già accennato in un articolo scorso, che
il bit più significativo indica se il tasto è premuto o meno, quello
meno significativo indica se il tasto ha attivato il bloccaggio
di una funzionalità ( il tastierino numerico, lo scrolling, le maiuscole...
) cioè è in stato toggled (commutato).
Nella prossima puntata vedremo un esempio di gestione della tastiera,
modificando il progetto Prg22.
Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet