2012-02-26 13 views
8

KeyboardState.GetPressedKeys() devuelve un Key matriz de teclas actualmente presionadas. Normalmente, para saber si una clave es una letra o número, utilizaría Char.IsLetterOrDigit(char) pero el tipo dado es de la enumeración Keys y como resultado no tiene la propiedad KeyChar.¿Cómo determinar si una clave es una letra o número?

La fundición no funciona porque, por ejemplo, las claves como Keys.F5, cuando se convierten en un carácter, se convierten en la letra t. En este caso, F5 se vería como una letra o un dígito cuando claramente no lo es.

Entonces, ¿cómo se puede determinar si un valor de enumeración dado Keys es una letra o un dígito, dado que la conversión a un personaje da resultados impredecibles?

+0

¿Desea que F5 sea marcado como una letra o un número? – Dharun

+1

Mira aquí http://stackoverflow.com/questions/5718541/check-if-keys-is-letter-digit-special-symbol – Kamil

+0

@SwearWord: No. El problema es que cuando 'Keys.F5' se convierte en un personaje, se convierte en 't'. 'Keys.F5' debe fallar la prueba * is letter or number *. –

Respuesta

12
public static bool IsKeyAChar(Keys key) 
{ 
    return key >= Keys.A && key <= Keys.Z; 
} 

public static bool IsKeyADigit(Keys key) 
{ 
    return (key >= Keys.D0 && key <= Keys.D9) || (key >= Keys.NumPad0 && key <= Keys.NumPad9); 
} 
+0

¿Y qué hay del pobre 'ä'? – CodesInChaos

+2

No lo puede encontrar en la enumeración de claves (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.input.keys.aspx) – max

0

Tenga su propia tabla/conjunto de HashSets para asignar la enumeración Keys a los tipos que le interesan.

Hay solo unos cien valores diferentes, por lo que la tabla no será demasiado grande. Si le preocupaba el tamaño en la memoria, es un byte por valor de enumeración (si usa una matriz de bytes indexada por valores de Keys).

2

ya que “teclas numéricas” corresponden a rangos específicos dentro del Keys enumeración, no pudiste comprobar si su clave pertenece a alguno de los rangos?

Keys[] keys = KeyboardState.GetPressedKeys(); 
bool isDigit = keys.Any(key => 
    key >= Keys.D0  && key <= Keys.D9 || 
    key >= Keys.NumPad0 && key <= Keys.NumPad9); 
Cuestiones relacionadas