6
votes

C # Keys Enumération Confus: Keys.alt ou Keys.Rbutton | Keys.Shiftkey | Keys.alt

J'essayais de tester si la touche Alt a été enfoncée.

J'ai eu une vérification similaire à: xxx

de toute façon doit dire quand je suis allaité quand j'avais appuyé sur la touche Alt Le débogueur m'a dit que la clé appuyée était en réalité des keys.rbutton | Keys.Shiftkey | Keys.alt

Quelqu'un peut-il perdre de la lumière sur ce qui se passe ou peut-être signaler à un article qui peut expliquer?

Merci FZ

EDIT: Je suis toujours un peu perdu quant à la raison pour laquelle l'ENUM aurait-il d'autres valeurs de bits définies et non simplement la touche Alt? Je comprends que l'énum peut inclure plus d'un état avec les drapeaux attrivant, mais je ne suis pas sûr de savoir pourquoi il fait si tout ce que j'ai appuyé était alt?


1 commentaires

Je suis curieux pourquoi ces drapeaux sont toujours définis. Semble être un bug.


4 Réponses :


6
votes

Si vous souhaitez tester si alt est partie des touches enfoncées, vous pouvez effectuer un test binaire; xxx


8 commentaires

Qui vaut mieux d'une perspective de codage? == Keys.alt ou! = 0?


"== Keys.alt" est la meilleure forme. Dans tous les cas où la valeur (touches.alt dans ce cas) n'est pas une valeur de bit unique, le test! = 0 donnera de faux positifs. Bien que dans cette CAE, il n'y a pas de différence, il est préférable d'être précis afin que vous ne soyez jamais pris au piège par un cas où! = 0 échouera.


P.s. La manière la plus propre est en fait de mettre en œuvre une méthode de bibliothèque qui encapsule ce test sur une forme lisible par l'homme et facilement dactylographié. Il est facile de taper && ou | quand vous vouliez dire &. Utilisation si (isbitset (keydata, clés.alt) est plus lisible et moins sujette d'erreur.


@Jason bonne idée. Consultez les fonctions ci-dessous Stackoverflow.com/Questions/1369312/...


Cela ne répond pas à la question de l'OP. Et je suis très curieux de savoir que!


@ Áxelcostaspena Pouvez-vous être précis sur la façon dont il ne répond pas?


Titre: "C # Keys Enumeration Confus: Keys.alt ou Keys.Rbutton | Keys.Shiftkey | Keys.alt". Corps CV: "De toute façon inutile de dire quand je suis allaité lorsque j'avais appuyé sur la touche Alt, le débogueur m'a dit que la clé qui était pressée était en fait des clés.Rbutton | Keys.shiftkey | Keys.alt. Quelqu'un peut-il perdre de la lumière sur ce qui se passe sur ou peut-être signaler à un article qui peut expliquer? " Le phénomène des claviers fantômes n'a pas été expliqué, seule une solution de contournement fournie.


La partie déroutante est-elle que Microsoft n'a pas utilisé de pouvoirs de deux pour chacune des clés? Par exemple, l'Enum Key Enum est 13. Ce qui montre dans le débogueur en tant que LBUTTON | Mbutton | Retour (1 + 4 + 8).



4
votes

Keys est un Drapeaux énumération . Cela signifie qu'il peut avoir plus d'une valeur à un moment donné. Vous devriez le vérifier comme si:

if ( (keyData & Keys.Alt) == Keys.Alt)
{
   // Alt was pressed!
}


5 commentaires

Ne répond pas à la question de l'OP


@ Áxelcostaspena Vous n'êtes pas sûr d'être d'accord - cela explique pourquoi le problème existe et montre comment vérifier correctement. Que voulez-vous de plus?


Titre: "C # Keys Enumeration Confus: Keys.alt ou Keys.Rbutton | Keys.Shiftkey | Keys.alt". Corps CV: "De toute façon inutile de dire quand je suis allaité lorsque j'avais appuyé sur la touche Alt, le débogueur m'a dit que la clé qui était pressée était en fait des clés.Rbutton | Keys.shiftkey | Keys.alt. Quelqu'un peut-il perdre de la lumière sur ce qui se passe sur ou peut-être signaler à un article qui peut expliquer? " Le phénomène des claviers fantômes n'a pas été expliqué, seule une solution de contournement fournie.


@ Áxelcostaspena Le phénomène est exactement ce que j'ai publié - c'est un drapeau énumé, ce qui signifie qu'il allume de l'alt, mais aussi qu'il s'agissait du bon bouton Alt, etc.


Je ne comprends toujours pas pourquoi un mot de travail de drapeau est défini lorsque j'appuie simplement ALT. Et je pense que le scénario de l'OP est le même.



1
votes

Enum avec FlagSaTribute est implémenté à l'aide de bits.
Voir ce lien pour un bon début - http://msdn.microsoft.com/ EN-US / Bibliothèque / CC138362.ASPX

Edit: Appuyez-vous à droite (bouton de la souris) avec la touche Maj pendant l'opération, pour sélectionner / mettre en surbrillance quelque chose, tout en débogage?


5 commentaires

Je suis toujours un peu perdu quant à la raison pour laquelle l'ENUM aurait-il d'autres valeurs de bits définies et non simplement la touche Alt? Je comprends que l'énum peut inclure plus d'un état mais je ne suis pas sûr de savoir pourquoi il fait si tout ce que j'ai appuyé était alt?


Non. J'avais simplement placé le point d'arrêt au début de la méthode et appuyez sur la touche Alt.


Je dois ajouter que j'utilise une trousse à outils de l'interface graphique 3e partie, il peut donc y avoir une chance qu'ils ajoutent à la clé à traiter, mais j'espère qu'ils ne sont pas.


En supposant que vous n'ajoutez pas de code pour gérer ALT, le contrôle prendra-t-il une action lorsque vous appuyez sur Alt?


Supprimer la casse-arrêt et mettre la déclaration comme Console.writeline (Keys) pour voir ce qu'il faut dire?



1
votes

Technique de Mark ( La réponse acceptée ) fonctionne pour les clés de modification, mais Cela m'a surpris par surprise que certaines touches (par exemple, des flèches) soient des combinaisons de bits et ne fonctionneront pas. Par exemple, le test suivant s'avère être vrai:

((Keys.Right & Keys.Left) == Keys.Left) 


0 commentaires