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