Corso di Visual C++

La gestione degli eventi di tastiera III

 

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