2010-09-30 10 views
7

Quando si gestisce l'evento Control.OnKeyPress, c'è un KeyPressEventArgs che contiene uno KeyChar.Ottieni il carattere su Control.KeyDown?

Per motivi di usabilità ho bisogno esattamente dello stesso KeyChar ma quando si gestisce l'evento OnKeyDown.

Il KeyEventArgs non contiene dati relativi al carbone. Voglio dire, se si preme la chiave A con o senza Shift non ha effetto su KeyCode, KeyData o KeyValue. Lo stesso quando si utilizza un'altra lingua, ho ancora i valori in inglese capitale.

Come ottenere un evento KeyPressEventArgs.KeyChar all'interno di KeyDown?

Grazie.

+2

E quale carattere si desidera quando viene rilasciato il tasto Alt? –

+1

'KeyPress' non si attiva quando il tasto Alt viene rilasciato, ma 'OnKeyDown' si attiva comunque, in questo caso il char' \ 0 'è abbastanza buono. – DxCK

risposta

9

Converti. Ecco una semplice funzione per convertire 'A' in 'a'. Converte solo caratteri maiuscoli dal set [A-Z]. Il valore 32 è diff tra 'A' e 'a' .. Certo, puoi estenderlo alle tue esigenze, o chiedere funzionalità qui.

char getChar(KeyEventArgs e) 
{ 
int keyValue = e.KeyValue; 
if (!e.Shift && keyValue >= (int) Keys.A && keyValue <= (int) Keys.Z) 
    return (char)(keyValue + 32); 
return (char) keyValue; 
} 

se avete bisogno di opere con la vostra cultura attuale si dovrebbe eseguire l'override metodo ProcessKeyMessage di controllo:

protected override bool ProcessKeyMessage(ref Message m) 
{ 
if ((m.Msg == 0x102) || (m.Msg == 0x106)) // this is special - don't remove 
{ 
    char c = (char) m.WParam; // here is your char for OnKeyDown event ;) 
} 
return base.ProcessKeyMessage(ref m); 
} 

spero che utile.

+1

E come considero il linguaggio attivo? ad esempio, se la lingua attiva è il russo, voglio ottenere caratteri russi. – DxCK

+1

È necessario eseguire l'override del metodo di controllo ProcessKeyMessage come descritto nel mio post. – mastak

+0

il secondo codice è sufficiente, cattura anche lo shfit. – Letterman

0

Penso che quello che stai cercando sia di fatto la proprietà KeyCode.

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    // Determine whether the key entered is the F1 key. If it is, display Help. 
    if(e.KeyCode == Keys.A) 
    { 
     // Do something kewl 
    } 
    else if(e.KeyCode == Keys.B) 
    { 
     // Do something even kewler 
    } 
} 

Se stai cercando determinate chiavi, puoi impostare una posizione dell'interruttore o qualunque cosa il tuo cuore desideri.

0

Se il motivo per cui si desidera utilizzare KeyDown anziché KeyPress è acquisire le informazioni aggiuntive fornite a un evento KeyDown, è possibile acquisire tali informazioni aggiuntive in un evento KeyDown e quindi utilizzarlo quando si ottiene KeyPress. ? Piuttosto un approccio hokey, certo, ma non sono sicuro di nessun altro approccio che funzionerà davvero in una mappatura della tastiera che ha "dead keys" (cioè sequenze a due tasti che producono un singolo carattere). Non so perché Microsoft non abbia portato più informazioni attraverso l'evento KeyPress (o molti dei suoi eventi, se è per questo) dal momento che cercare di associare eventi causa-effetto non è perfetto, ma io non so davvero un'alternativa migliore.

+0

Il motivo per cui voglio usare 'KeyDown' invece di' KeyPress' è quello di ridurre il tempo tra l'utente che preme un tasto fino alla risposta del mio programma. L'attivazione di 'KeyPress' solo dopo che l'utente ha lasciato il tasto, e questo aggiunge ulteriore tempo inutile finché il mio programma non risponde. – DxCK