2010-09-03 28 views
8

Manejo el evento de desactivación de teclas en uno de mis controles. Si la tecla presionada es una entrada real (alfabética, numérica o símbolo de algún tipo), quiero adjuntarla a una cadena que tengo. Si es un personaje de control (entrar, escapar, etc.) no quiero hacer nada.Cómo determinar si KeyCode es carácter imprimible

¿Existe una forma rápida y fácil de determinar si el código de tecla es un carácter imprimible o un carácter de control?

Actualmente estoy haciendo

if (e.KeyCode == Keys.Enter) 
     { 
     e.Handled = false; 
     return; 
     } 

Pero sé que hay probablemente un poco más teclas que no se preocupan por que hacer algo importante en el controlador del sistema, por lo que no quieren para manejarlos.

Respuesta

8

Si solo desea caracteres imprimibles, probablemente no desee OnKeyDown. Debería utilizar OnKeyPress en su lugar, que se llama solo para caracteres imprimibles (más o menos), y aplica traducciones para teclas modificadoras (Shift, principalmente).

Dije "más o menos" arriba, porque también obtendrá los caracteres de control, que no son necesariamente imprimible. Sin embargo, estos pueden filtrarse fácilmente con char.IsControl.

protected override void OnKeyPress(KeyPressEventArgs e){ 
    if(!char.IsControl(e.KeyChar)){ 
     // do something with printable character 
    } 
} 

Algo que es fácil pasar por alto en un diseño de este tipo es la tecla de retroceso. Normalmente, el mejor comportamiento al recibir un carácter de retroceso ('\b', o (char)8) es eliminar el último carácter de su búfer. Es fácil olvidarse de hacer esto.

6

Si maneja el evento KeyPress en lugar de KeyDown, el KeyPressEventArgs tendrá una propiedad de KeyChar. Eso reducirá el número de eventos clave "extra" que obtienes. A continuación, puede usar algo como char.IsLetterOrDigit o char.IsControl para filtrar lo que desee.

3

Suponiendo que solo tiene el KeyCode, puede intentar P/Invocar en la función MapVirtualKey. No estoy seguro si esto funcionará para todas las culturas.

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
private static extern int MapVirtualKey(int uCode, int uMapType); 

public static bool RepresentsPrintableChar(this Keys key) 
{ 
    return !char.IsControl((char)MapVirtualKey((int)key, 2)); 
} 

Console.WriteLine(Keys.Shift.RepresentsPrintableChar()); 
Console.WriteLine(Keys.Enter.RepresentsPrintableChar()); 
Console.WriteLine(Keys.Divide.RepresentsPrintableChar()); 
Console.WriteLine(Keys.A.RepresentsPrintableChar()); 

Salida:

false 
false 
true 
true 
0

Comprobar esta función, es posible que desee echar char a byte (o simplemente editar la función):

bool IsPrintable(byte item) 
{ 
    // Range of chars from space till ~ (tilda) 
    return item >= 32 && item < 126; 
} 
Cuestiones relacionadas