2010-09-30 7 views
7

Al manejar el evento Control.OnKeyPress, hay un KeyPressEventArgs que contiene un KeyChar.Obtener el char en Control.KeyDown?

Por razones de usabilidad necesito exactamente el mismo KeyChar pero al manejar el evento OnKeyDown.

El KeyEventArgs no contiene ningún dato relacionado con el tema. Es decir, si presiona la tecla A con Shift o sin ella, no afecta al KeyCode, KeyData o KeyValue. Lo mismo cuando se usa otro idioma, sigo obteniendo valores de inglés capital.

¿Cómo obtener un KeyPressEventArgs.KeyChar dentro de KeyDown evento?

Gracias.

+2

¿Y qué char desea cuando se suelta la tecla Alt? –

+1

'KeyPress' no se enciende cuando se suelta la tecla Alt, pero 'OnKeyDown' se activa de todos modos, en este caso el carácter' \ 0 'es suficiente. – DxCK

Respuesta

9

Conviértelo. Aquí hay una función simple para convertir 'A' en 'a'. Solo convierte caracteres de capital del [A-Z] conjunto. El valor 32 es diferente entre "A" y "a". Claro que puede ampliarlo a sus requisitos, o solicitar la función aquí.

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; 
} 

si lo necesita para obras con su cultura actual se debe reemplazar el método de control ProcessKeyMessage:

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); 
} 

espero que útiles.

+1

¿Y cómo estoy considerando el idioma activo? por ejemplo, si el idioma activo es ruso, quiero obtener caracteres rusos. – DxCK

+1

Debe reemplazar el método ProcessKeyMessage Control como se describe en mi publicación. – mastak

+0

el segundo código es suficiente, también atrapa el paso. – Letterman

0

Creo que lo que está buscando es, de hecho, la propiedad 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 
    } 
} 

Si solo está buscando ciertas teclas, puede configurar una declaración de interruptor o lo que desee.

0

Si la razón por la que desea utilizar KeyDown en lugar de KeyPress es capturar la información adicional que se le da a un evento KeyDown, ¿podría capturar esa información adicional en un evento KeyDown y luego usarla cuando obtenga el KeyPress? ? Más bien es un enfoque hokey, para estar seguro, pero no estoy seguro de ningún otro enfoque que realmente funcione en un mapeo de teclado que tenga "teclas muertas" (es decir, secuencias de dos teclas que producen un único carácter). No sé por qué Microsoft no llevó más información al evento KeyPress (o muchos de sus eventos, para el caso) ya que tratar de hacer coincidir los eventos de causa y efecto no es perfecto, pero yo no Realmente conozco una mejor alternativa.

+0

La razón por la que deseo utilizar 'KeyDown' en lugar de' KeyPress' es reducir el tiempo entre el usuario que presiona una tecla hasta la respuesta de mi programa. 'KeyPress' solo se dispara después de que el usuario dejó la tecla, y esto agrega un tiempo adicional innecesario hasta que mi programa responda. – DxCK