2012-02-26 12 views
8

KeyboardState.GetPressedKeys() restituisce un array di tasti attualmente premuti. Normalmente per scoprire se una chiave è una lettera o un numero, vorrei usare Char.IsLetterOrDigit(char) ma il tipo specificato è dell'enumerazione Keys e di conseguenza non ha la proprietà KeyChar.Come determinare se una chiave è una lettera o un numero?

La trasmissione non funziona perché, ad esempio, chiavi come Keys.F5, se convertite in un carattere, diventano la lettera t. In questo caso, F5 verrà quindi visualizzato come una lettera o una cifra quando chiaramente non lo è.

Quindi, come si può determinare se un dato valore di enumerazione Keys è una lettera o una cifra, dato che il casting su un personaggio dà risultati imprevedibili?

+0

Desiderate che F5 venga contrassegnato come una lettera o un numero? – Dharun

+1

Guardate qui http://stackoverflow.com/questions/5718541/check-if-keys-is-letter-digit-special-symbol – Kamil

+0

@SwearWord: No. Il problema è che quando 'Keys.F5' è castato a un personaggio diventa 't'. 'Keys.F5' dovrebbe fallire il * è lettera o numero * test. –

risposta

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

E che dire di poveri 'ä'? – CodesInChaos

+2

Impossibile trovarlo nell'enumerazione di Keys (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.input.keys.aspx) – max

0

Avere la propria tabella/set di hash per mappare l'enumerazione Keys ai tipi che sono interessati.

Ci sono solo un centinaio di valori diversi, quindi la tabella non sarà troppo grande. Se ti preoccupi delle dimensioni in memoria, è un byte per valore di enumerazione (se si utilizza un array di byte indicizzato dai valori Keys).

2

dato che “tasti numerici” corrispondono a intervalli specifici all'interno del Keys enumerazione, non hai potuto verificare se la chiave appartiene ad uno qualsiasi degli intervalli?

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