Corso di Visual C++

La gestione degli eventi di tastiera II

 

Nella scorsa puntata, abbiamo detto che i gestori per i messaggi WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN e WM_SYSKEYUP hanno il seguente prototipo:

afx_msg void OnMsgName (UINT nChar, UINT nRepCnt, UINT nFlags)

- nChar è il codice di tasto virtuale del tasto oggetto del messaggio. Questo valore è indipendente dal bios e dall'hardware in genere.
- nRepCnt è il numero di messaggi uguali relativi a quel tasto che la vostra applicazione ha ricevuto e che non è riuscita a gestire. Questo parametro permette di evitare il problema dell'overrun: ciò che l'applicazione continui ad esempio a stampare a video un carattere anche dopo che abbiamo rilasciato il tasto corrispondente. Per evitare il problema basta ignorare questo parametro, in caso contrario ci si deve comportare come se il nostro gestore fosse stato chiamato un numero di volte pari al suo valore.
- nFlags contiene il codice di scansione OEM del tasto più alcuni bit aggiuntivi; vediamo la seguente tabella:

Bit

Significato

Descrizione

0-7

Codice di scansione

Codice di scansione OEM a 8 bit

8

Indicatore tasto esteso

1=esteso, 0=non esteso

9-12

Riservato

N/D

13

Indicatore di contesto

1=tasto ALT premuto, 0=caso opposto

14

Indicatore stato precedente tasto

1=premuto, 0=non premuto

15

Indicatore stato transizione

1=rilascio in corso, 0=pressione in corso


Vediamo adesso cosa significano tutti questi indicatori.

- Il codice di scansione OEM a 8 bit è un codice che lega al BIOS il tasto premuto. Solitamente si ignora questo valore perché dipende dal particolare hardware utilizzato, per trasformarlo comunque in un codice di tasto virtuale si può utilizzare la funzione API ::MapVirtualKey.
- L'indicatore di tasto esteso è 1 se il tasto premuto è CTRL O ALT della parte destra della tastiera o i tasti HOME, FINE, INS, CANC, PGSU, PGGIU, INVIO, i tasti freccia, i tasti del tastierino numerico o la barra (/).

- L'indicatore di contesto è 1 se il tasto ALT è premuto quando viene inviato il messaggio. Con l'eccezione che resta comunque a 0 per i messaggi WM_KEYDOWN.
- L'indicatore di stato precedente vale 1 se il tasto era premuto anche alla ricezione del precedente messaggio OnMsgName. Solitamente vale 1 quando il tasto è premuto per un lasso di tempo relativamente lungo.
- L'indicatore di stato di transizione vale 1 per i messaggi WM_KEYUP e WM_SYSKEYUP e 0 per i corrispondenti messaggi WM_KEYDOWN e WM_SYSKEYDOWN.

È buona norma non gestire i messaggi WM_SYSKEYDOWN e WM_SYSKEYUP, infatti questi solitamente sono diretti al sistema operativo. Nel caso che questo sia proprio necessario si raccomanda almeno di ripassarli alla funzione di gestione di default con gli stessi parametri ricevuti (magari come prima operazione, prima di procedere con ulteriori elaborazioni).

In genere il valore più importante di queste funzioni è nChar, cioè il codice di tasto virtuale. Ecco la lista completa dei codici di tasto virtuale: ( la spiegazione per ognuno mi sembra superflua )

  VK_LBUTTON       
  VK_RBUTTON       
  VK_CANCEL        
  VK_MBUTTON
  VK_BACK          
  VK_TAB           
  VK_CLEAR      
  VK_RETURN        
  VK_SHIFT         
  VK_CONTROL 
  VK_MENU        
  VK_PAUSE       
  VK_CAPITAL   
  VK_ESCAPE      
  VK_CONVERT       
  VK_NONCONVERT   
  VK_ACCEPT        
  VK_MODECHANGE 

  VK_SPACE        
  VK_PRIOR         
  VK_NEXT       
  VK_END         
  VK_HOME          
  VK_LEFT          
  VK_UP           
  VK_RIGHT      
  VK_DOWN       

  VK_SELECT     
  VK_PRINT       
  VK_EXECUTE      
  VK_SNAPSHOT    
  VK_INSERT      
  VK_DELETE      
  VK_HELP         
  VK_0 ... VK_9
  VK_A ... VK_Z
  VK_LWIN           
  VK_RWIN          
  VK_APPS         
  VK_NUMPAD0       
  VK_NUMPAD1       
  VK_NUMPAD2       
  VK_NUMPAD3       
  VK_NUMPAD4       
  VK_NUMPAD5      
  VK_NUMPAD6       
  VK_NUMPAD7      
  VK_NUMPAD8      
  VK_NUMPAD9     
  VK_MULTIPLY     
  VK_ADD          
  VK_SEPARATOR   
  VK_SUBTRACT     
  VK_DECIMAL      
  VK_DIVIDE       
  VK_F1           
  VK_F2            
  VK_F3           
  VK_F4           
  VK_F5            
  VK_F6            
  VK_F7            
  VK_F8         
  VK_F9           

  VK_F10          
  VK_F11         
  VK_F12          
  VK_F13           
  VK_F14           
  VK_F15           
  VK_F16          
  VK_F17           
  VK_F18           
  VK_F19           
  VK_F20           
  VK_F21          
  VK_F22          
  VK_F23          
  VK_F24          

  VK_NUMLOCK     
  VK_SCROLL       

  VK_LSHIFT       
  VK_RSHIFT        
  VK_LCONTROL      
  VK_RCONTROL      
  VK_LMENU         
  VK_RMENU        

Per ulteriori approfondimenti sull'argomento discusso in questa puntata, vi rimando alla prossima.

 

Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet