7
votes

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

i Remplacer processcmdkey et quand j'obtiens clés argument, je veux vérifier si ces touches sont la lettre ou le symbole spécial. < P> J'ai cet extrait xxx

tout fonctionne pour les lettres et les chiffres. Mais quand j'appuie sur F1-F12, il les convertit en lettres.

Peut-être que quelqu'un sait un meilleur moyen de résoudre cette tâche?


3 commentaires

Le problème est que vous casserez keydata à un caractère. Vous ne pouvez pas faire ça. Vous devez utiliser les constantes définies dans la liste énumération pour obtenir cette information.


Peut-être que vous pouvez essayer Stackoverflow.com/Questtions/887377/...


En regardant les valeurs des touches Enum, on pense en effet initialement "Ces valeurs d'énorme sont des codes de caractères". Mais en y réfléchissant, c'est impossible, car a) il y a des clés qui n'ont pas de caractères, par ex. dormir , et b) il y a aussi des clés qui partagent le même caractère, par ex. d0 et numpad0 : même s'ils ont le même caractère 0 ils ne peuvent pas tous deux partager à la même valeur Enum, car ils seraient alors indiscernables Ainsi, au moins l'un d'entre eux mappe à une valeur arbitraire. (Je sais que c'est vieux, je voulais juste clarifier pourquoi casting ne fonctionne pas.)


6 Réponses :


3
votes

Essayez

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


1 commentaires

Je n'ai pas besoin de faire quelque chose lorsque F1-F12 pressé. J'ai besoin de vérifier si j'ai enfoncé une lettre, un chiffre ou un symbole spécial



1
votes

Essayez d'utiliser keydata.keycode Code> et peut-être même des tests dans une plage au lieu d'utiliser le caractère char.isletterordigit. E.G.

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


5 commentaires

Qu'en est-il des symboles spéciaux + = - / \? et e.t.c


@Zlobaton: Vous voulez dire keys.add , clés.subrent , keys.divide , etc., etc.?


Et Bang, tous les utilisateurs de votre logiciel qui utilisent un clavier non latin (par exemple, une expérience de logiciel complètement brisé. Il y a une raison de l'existence de char.sletterordigit et al. - Utilise les.


Je veux dire tous les symboles que vous pouvez taper.


@Timwi: Le point que je stressait était keycode existe (et ne pas commencer par une distribution). Vous êtes absolument raison, ce ne serait pas universel.



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

2 commentaires

Je n'ai pas besoin de faire quelque chose lorsque F1-F12 pressé. J'ai besoin de vérifier si j'ai enfoncé une lettre, un chiffre ou un symbole spécial


@Zlobaton: Définissez SPÉCIAL SYMBOY .



0
votes

Vous avez besoin d'une déclaration de commutation / cas géante ou de vérification des gammes. Vous trouverez peut-être plus facilement de vérifier les clés que vous souhaitez exclure, selon laquelle il y a moins de. Regardez cela pour toutes les valeurs possibles. http://msdn.microsoft.com/en-us /library/system.windows.forms.keys.aspx xxx

ou xxx


0 commentaires

14
votes

remplacer la méthode de la formulaire la méthode. Le keighpressereventargs fournit un keychar propriété qui vous permet d'utiliser les méthodes statiques sur char .

Comme mentionné par Cody Grey dans les commentaires, cette méthode ne tire que sur les coups de clé qui ont des informations de caractère. Les autres traits clés tels que F1-F12 doivent être traités dans ONKEYDOOD ou oneKeUp , en fonction de votre situation.

de MSDN :

Les événements clés se produisent dans ce qui suit Ordre:

  • clé
  • KeyPress
  • Keyup

    L'événement KeyPress n'est pas soulevé par Touches de non -character ; Cependant, le Les touches de non-baacteur font la clé et événements de porte-clés.

    exemple xxx


3 commentaires

Notez que cela se produit à un niveau beaucoup plus élevé que le processcmdkey , et il est soumis à certaines touches manquantes pour diverses raisons. Si cela fonctionne pour vos besoins, génial. Mais il est important de réaliser que cela pourrait ne pas - ce n'est pas un remplacement d'abandon de la fonctionnalité et des objectifs équivalents.


Certainement pas, onKeyPress ne fournit que le keychar et rien d'autre, c'est pourquoi il est aussi approprié que cette situation spécifique. Les autres traits clés doivent être traités dans ONKEYDODODDOX .


.. ou OnKeyUp d'ici la matière. J'ai mis à jour la réponse avec plus d'informations.



0
votes

J'ai essayé le code suivant, mais pour une raison quelconque de la méthode Char.Sletter () reconnaît les clés suivantes en tant que lettres ???

F1, F8, F9, F11, F12, F11, F12, Voyage, Rightsalt, DroiteCtrl, Gauchectrl, gauchers, droit à droite, numlock.

Cette méthode ne semble pas être la preuve complète concernant ce qu'elle pense est une lettre. xxx


0 commentaires