2011-04-19 16 views
7

Zastępuję ProcessCmdKey, a gdy otrzymam argument Keys, chcę sprawdzić, czy ten Keys jest literą lub cyfrą lub symbolem specjalnym.Sprawdź, czy klucz jest literą/cyfrą/symbolem specjalnym

Mam ten fragment

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); 
    } 

wszystko działa dla liter i cyfr. ale po naciśnięciu F1-F12 konwertuje je na litery.

Może ktoś zna lepszy sposób na rozwiązanie tego zadania?

+0

Problem polega na tym, że rzucasz 'keyData' na postać. Nie możesz tego zrobić. Aby uzyskać te informacje, musisz użyć stałych zdefiniowanych w wyliczeniu 'Keys'. –

+0

Może być możesz spróbować http://stackoverflow.com/questions/887377/how-do-i-get-a-list-of-all-the-printable-characters-in-c –

Odpowiedz

11

Zastąpienie OnKeyPress metody formularza zamiast. Obiekt KeyPressEventArgs zapewnia właściwość KeyChar, która umożliwia korzystanie ze statycznych metod na char.

Jak wspomniano przez Cody Grey w komentarzach, ta metoda tylko pożary na naciśnięć klawiszy, które posiadają informacje o postaciach. Inne naciśnięcia klawiszy, takie jak F1-F12, powinny być przetwarzane w OnKeyDown lub OnKeyUp, w zależności od sytuacji.

Od MSDN:

Kluczowe zdarzenia w następującym kolejności:

Zdarzenie KeyPress nie jest wywoływane przez klawiszy nieznakowanych; jednak klawisze noncharacter podnoszą zdarzenia KeyDown i KeyUp.

Przykład

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

Zauważ, że dzieje się to na znacznie wyższym poziomie niż' ProcessCmdKey', a to z kolei powoduje, że niektóre z nich są pomijane z różnych powodów. Jeśli to działa dla twoich celów, świetnie. Ale ważne jest, aby zdać sobie sprawę, że może nie - nie jest to zamiennik zastępczy o równoważnej funkcjonalności i przeznaczeniu. –

+0

Zdecydowanie nie, 'OnKeyPress' zapewnia tylko' KeyChar' i nic więcej, dlatego jest tak dopasowany do tej konkretnej sytuacji. Inne naciśnięcia klawiszy powinny być przetwarzane w 'OnKeyDown'. – bernhof

+0

.. lub 'OnKeyUp' w tej sprawie. Zaktualizowałem odpowiedź, podając więcej informacji. – bernhof

3

Spróbuj

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

I don Kiedy F1-F12 naciskał, trzeba coś zrobić. Muszę sprawdzić, czy nacisnąłem literę, cyfrę lub specjalny symbol – Zlobaton

+0

@Zlobato, jak o tej edytowanej odpowiedzi? –

1

Spróbuj użyć keyData.KeyCode a może nawet badania w zakresie zamiast używania Char.IsLetterOrDigit. na przykład

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

Co ze specjalnymi symbolami '+ = -/\? 'i e.t.c – Zlobaton

+0

@Zlobaton: Masz na myśli' Keys.Add', 'Keys.Subtract',' Keys.Divide', itd.? –

+2

A wszyscy użytkownicy twojego oprogramowania korzystającego z klawiatury innej niż łacińska (np. Rosyjski, grecki, hindi, ...) doświadczają całkowicie zepsutego oprogramowania. Istnieje powód istnienia 'char.IsLetterOrDigit' et al. - Użyj ich. – Timwi

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

Nie muszę nic robić, gdy naciska się F1-F12. Muszę sprawdzić, czy nacisnąłem literę, cyfrę lub specjalny symbol – Zlobaton

+0

@Zlobaton: Definiuj * specjalny symbol *. –

+0

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

0

trzeba albo gigantyczny switch/case lub sprawdzić zakresy. Możesz łatwiej sprawdzić klucze, które chcesz wykluczyć, w zależności od tego, która liczba jest mniejsza. Spójrz na to dla wszystkich możliwych wartości. http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx

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

lub

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

Próbowałem następujące kodu, ale z jakiegoś powodu char.IsLetter() w rozpoznaje następujące ustawienia jak Letters ???

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

Ta metoda nie wydaje się być pełnym dowodem na to, co uważa za list.

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