Vérifier si les clés sont lettre / chiffre / symbole spécial

Je remplace ProcessCmdKey et lorsque je récupère l’argument Keys , je souhaite vérifier si cette Keys est Letter, Digit ou Special Symbol.

J’ai cet extrait

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

Tout fonctionne pour les lettres et les chiffres. mais lorsque j’appuie sur F1-F12, il les convertit en lettres.

Peut-être que quelqu’un connaît le meilleur moyen de résoudre cette tâche?

Remplacez la méthode OnKeyPress du formulaire à la place. KeyPressEventArgs fournit une propriété KeyChar qui vous permet d’utiliser les méthodes statiques sur char .

Comme mentionné par Cody Gray dans les commentaires, cette méthode ne se déclenche que sur les touches contenant des informations de caractère. D’autres touches, telles que F1 à F12, doivent être traitées dans OnKeyDown ou OnKeyUp , selon votre situation.

De MSDN :

Les événements clés se produisent dans l’ordre suivant:

  • Touche Bas
  • Appuyez sur la touche
  • KeyUp

L’ événement KeyPress n’est pas déclenché par des clés autres que des caractères ; Toutefois, les clés non-caractères déclenchent les événements KeyDown et KeyUp.

Exemple

 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, eg char.IsSymbol } } 

Essayer

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

Essayez d’utiliser keyData.KeyCode et peut-être même de tester dans une plage au lieu d’utiliser Char.IsLetterOrDigit. par exemple

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

vous avez besoin d’un commutateur / énoncé de cas géant ou d’une vérification des scopes. Vous trouverez peut-être plus facile de rechercher les clés à exclure, selon le nombre de clés. Regardez ceci pour toutes les valeurs possibles. http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx

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

ou

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

J’ai essayé le code suivant mais pour une raison quelconque la méthode char.IsLetter () reconnaît les clés suivantes en tant que lettres ???

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

Cette méthode ne semble pas être la preuve la plus complète de ce qu’il pense être une lettre.

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