2012-02-26 15 views
8

KeyboardState.GetPressedKeys() zwraca tablicę aktualnie wciśniętych klawiszy. Normalnie, aby dowiedzieć się, czy klucz jest literą lub cyfrą, użyłbym Char.IsLetterOrDigit(char), ale podany typ jest z wyliczenia Keys iw rezultacie nie ma właściwości KeyChar.Jak ustalić, czy klucz jest literą lub cyfrą?

Casting nie działa, ponieważ na przykład klucze takie jak Keys.F5 po odlaniu do postaci stają się literą t. W takim przypadku, F5 byłoby wtedy postrzegane jako litera lub cyfra, gdy wyraźnie nie jest.

Jak zatem określić, czy podana wartość Keys jest cyfrą lub literą, biorąc pod uwagę, że rzutowanie na postać daje nieprzewidywalne wyniki?

+0

Życzysz sobie, aby F5 było oflagowane jako list lub numer? – Dharun

+1

Spójrz tutaj http://stackoverflow.com/questions/5718541/check-if-keys-is-letter-digit-special-symbol – Kamil

+0

@SwearWord: Nie. Problem polega na tym, że gdy 'Keys.F5' jest rzucany do postaci staje się 't'. 'Klucz Keys.F5' nie powinien być testem * jest literą lub cyfrą *. –

Odpowiedz

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

A co z kiepskim 'ä'? – CodesInChaos

+2

Nie można znaleźć tego w wyliczaniu kluczy (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.input.keys.aspx) – max

0

Masz własną tabelę/zestaw HashSets, aby mapować wyliczenie Keys na typy, które są zainteresowane.

Jest tylko setka różnych wartości - więc stół nie będzie zbyt duży. Jeśli martwisz się rozmiarem w pamięci - jest to jeden bajt na wartość wyliczenia (jeśli używasz tablicy bajtów indeksowanych wartościami Keys).

2

Biorąc pod uwagę, że „cyfra” klawisze odpowiadają określonych zakresów w Keys wyliczenie, nie można po prostu sprawdzić, czy klucz należy do każdego z zakresów?

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