2011-09-06 9 views
11

Estoy codificando un editor de texto personalizado, y uso los eventos KeyDown y KeyUp. Ese evento obtiene un KeyEventArgs de los parámetros donde se incluye una instancia de "clave".Obtener Char de la clave

¿Cómo puedo transformar esa "Clave" en un personaje real?

Usando Key.ToString() con un "." Obtengo un "OmePeriod" o con "," obtengo un "OmeComma". Puedo transformar esos valores directamente ... pero es un trabajo arduo, y estoy seguro de que debe existir cualquier clase que transforme esas Llaves al verdadero "char".

Gracias!

Atentamente.

+1

Ya se discutió http://stackoverflow.com/questions/7103360/how-to-get-pressed-char-from-system-windows-input-keyeventargs~~V~~3rd – Samich

+0

creo respuestas a http: // stackoverflow.com/questions/544141/how-to-convert-a-character-in-to-equivalent-system-windows-input-key-enum-value question puede ayudar. – Dmitriy

+0

Posible duplicado de [C# ¿Cómo traducir el código clave virtual a char?] (Http://stackoverflow.com/questions/318777/c-sharp-how-to-translate-virtual-keycode-tochar) – bummi

Respuesta

3

El principal problema aquí es que el evento que está atrapando es un evento de teclado de carrete y que la clave es de hecho una clave y NO un carácter. ¡En medio está el mapa de teclas! Por ejemplo, al escribir shift-A, recibirá dos eventos en lugar de uno para presionar con la tecla.

esta discusión puede ayudar: C# How to translate virtual keycode to char?

3

En lugar de utilizar el evento KeyDown, intente utilizar el evento TextInput. Adjuntar un controlador de eventos que se ve así:

private void Grid_TextInput(object sender, TextCompositionEventArgs e) 
{ 
    Char keyChar = (Char)System.Text.Encoding.ASCII.GetBytes(e.Text)[0]; 
    Debug.WriteLine(keyChar); 
} 

Nota, esta toma sólo el primer byte, y esto no va a funcionar para el texto internacional (Unicode). Es posible que no funcione para eventos de entrada de texto más complejos, ¡así que tenga en cuenta!

Consulte this MSDN article para obtener más información.

+0

hay muchos preguntas para capturar textinput en wpf, algunas respuestas incluso se refieren a dlls del sistema. Pero tu respuesta es de lejos la mejor que he visto hasta ahora – jflepp

-4

emitir el e.KeyValue a char. como ejemplo:

por ejemplo.

private void myTextBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    char pressedCharacter = (char)e.KeyValue; 
} 
+0

No hay e.KeyValue – MSL

+0

Esto es lo que estaba buscando para mis propósitos. Gracias por una respuesta útil! –

+0

Me acabo de dar cuenta de que esto podría devolver malos resultados y probablemente no debería usarse en absoluto. Cuando estaba usando esto, presiono la tecla 'NumberPad 8' y aparece como KeyData y KeyCode con un KeyValue de' 104'. ¡Cuando se usa '(char) e.KeyValue' por otro lado, el valor' 104' se convierte en el carácter 'h' y NO' 8'! –