2011-04-19 12 views
7

Anulo ProcessCmdKey y cuando obtengo el argumento Keys, quiero verificar si este Keys es una letra o un dígito o un símbolo especial.Compruebe si las teclas son Carta/Dígito/Símbolo especial

que tienen este fragmento

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
      char key = (char)keyData; 
      if(char.IsLetterOrDigit(key) 
      { 
       Console.WriteLine(key); 
      } 
      return base.ProcessCmdKey(ref msg, keyData); 
    } 

Todo funciona de letras y dígitos. pero cuando presiono F1-F12, los convierte en letras.

Tal vez alguien sepa mejor manera de resolver esta tarea?

+0

El problema es que está lanzando 'keyData' a un personaje. No puedes hacer eso. Debe usar las constantes definidas en la enumeración 'Keys' para obtener esta información. –

+0

Puede ser que usted podría intentar http://stackoverflow.com/questions/887377/how-do-i-get-a-list-of-all-the-printable-characters-in-c –

Respuesta

11

Override método del formulario OnKeyPress su lugar. El KeyPressEventArgs proporciona una propiedad KeyChar que le permite utilizar los métodos estáticos en char.

Según lo mencionado por Cody Gray en los comentarios, este método solo se activa en las pulsaciones de tecla que tienen información de carácter. Se deben procesar otras teclas como F1-F12 en OnKeyDown o OnKeyUp, dependiendo de su situación.

De MSDN:

eventos clave se producen en el orden siguiente:

El evento KeyPress no lo provoca el claves que no son caracteres; sin embargo, las claves sin carácter elevan los eventos KeyDown y KeyUp.

Ejemplo

protected override void OnKeyPress(KeyPressEventArgs e) 
{ 
    base.OnKeyPress(e); 
    if (char.IsLetter(e.KeyChar)) 
    { 
    // char is letter 
    } 
    else if (char.IsDigit(e.KeyChar)) 
    { 
    // char is digit 
    } 
    else 
    { 
    // char is neither letter or digit. 
    // there are more methods you can use to determine the 
    // type of char, e.g. char.IsSymbol 
    } 
} 
+1

Tenga en cuenta que esto ocurre en un nivel mucho más alto que el 'ProcessCmdKey', y está sujeto a la falta de ciertas pulsaciones de tecla por varias razones. Si funciona para tus propósitos, genial. Pero es importante darse cuenta de que podría no serlo: no es un reemplazo inmediato con una funcionalidad y un propósito equivalentes. –

+0

Definitivamente no, 'OnKeyPress' solo proporciona el' KeyChar' y nada más, por lo que es apropiado para esta situación específica. Otras pulsaciones de teclas deberían procesarse en 'OnKeyDown'. – bernhof

+0

.. o 'OnKeyUp' para ese asunto. He actualizado la respuesta con más información. – bernhof

3

Trate

if(!(keyData >= Keys.F1 && keyData <= Keys.F12)) 
{ 
    char key = (char)keyData; 
    if(char.IsLetterOrDigit(key)) 
    { 
     Console.WriteLine(key); 
     return false; 
    } 

} 
return base.ProcessCmdKey(ref msg, keyData); 
+0

Pongo No es necesario hacer algo cuando se presiona F1-F12. Necesito comprobar si presioné la letra, el dígito o el símbolo especial – Zlobaton

+0

@Zlobato ¿qué tal esta respuesta editada? –

1

Trate de usar keyData.KeyCode y tal vez incluso probar dentro de un rango en lugar de utilizar el Char.IsLetterOrDigit. p.ej.

if (keyData.KeyCode >= Keys.D0 && keyData.KeyCode <= Keys.Z) { 
    ... 
} 
+0

¿Qué pasa con símbolos especiales '+ = -/\? 'y e.t.c – Zlobaton

+0

@Zlobaton: ¿Quiere decir' Keys.Add', 'Keys.Subtract',' Keys.Divide', etc.? –

+2

Y bang, todos los usuarios de su software que usan un teclado que no es de origen latino (por ejemplo, ruso, griego, hindi, ...) experimentan un software completamente dañado. Hay una razón para la existencia de 'char.IsLetterOrDigit' et al. - usalos, usalos a ellos. – Timwi

0
if (keyData >= Keys.F1 && keyData <= Keys.F12) 
{ 
    //one of the key between F1~F12 is pressed 
} 
+0

No necesito hacer nada cuando presiono F1-F12. Necesito verificar si presioné una letra, un dígito o un símbolo especial – Zlobaton

+0

@Zlobaton: Defina * símbolo especial *. –

+0

'+ = -/\?' Y e.t.c – Zlobaton

0

que necesita ya sea una sentencia switch/case gigante o comprobar si hay rangos. Es posible que le resulte más fácil verificar las claves que desea excluir, según cuál sea menor. Mire esto para todos los valores posibles. http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx

if (keyData >= Keys.A && keyData <= Keys.Z) 
    // do something 

o

switch(keyData) { 
case Keys.Add: 
case Keys.Multiply: 
// etc. 
    // do something 
    break; 
} 
-1

I han intentado el siguiente código pero por alguna razón char.IsLetter() método es el reconocimiento de las siguientes teclas como cartas ???

F1, F8, F9, F11, F12, RightShift, LeftShift, RightAlt, RightCtrl, LeftCtrl, LeftWin, RightWin, NumLock.

Este método no parece ser una prueba completa de lo que cree que es una carta.

if(char.IsLetter((char)e.Key) || char.IsDigit((char)e.Key))