2010-12-12 6 views
3

Après avoir configuré un événement, je ne suis pas en mesure d'identifier quelle touche de modification a été enfoncée en raison d'un événement CGEvent. Étant donné l'extrait ci-dessus, le premier NSLog renvoie une valeur différente de la deuxième NSLog. Il n'est pas surprenant que le conditionnel ne soit jamais déclenché lorsque la touche de modification de la commande est enfoncée.Obtention de la touche de modification enfoncée dans CGEvent appuyez sur

J'ai besoin d'identifier si la commande, l'alternative, l'option, le contrôle ou le décalage sont pressés pour un événement CGEvent donné. Tout d'abord, j'ai besoin d'aide pour comprendre pourquoi ce qui précède ne fonctionne pas.

Merci!

Répondre

6

Ce sont des masques binaires, qui seront associés par un OU bit à bit dans la valeur que vous recevez de CGEventGetFlags (ou qui sont transmis lors de la création d'un événement vous-même).

Vous ne pouvez pas tester l'égalité ici car aucun masque de bit unique ne sera égal à une combinaison de masques à plusieurs bits. Vous devez tester l'égalité d'un seul bit.

Pour extraire la valeur d'un masque de bit unique à partir d'un masque de bits combiné, utilisez l'opérateur ANDwise (&). Ensuite, comparez cela à vous masquez un seul bit intéresse:

BOOL commandKeyIsPressed = (flagsP & kCGEventFlagMaskCommand) == kCGEventFlagMaskCommand; 

Pourquoi deux?

L'expression & évalue au même type que ses opérandes, qui est CGEventFlags dans ce cas, qui ne peut pas tenir dans la taille d'un BOOL, qui est un signed char. L'expression == résout cela à 1 ou 0, qui est tout ce qui rentre dans un BOOL.

D'autres solutions à ce problème comprennent la négation de la valeur deux fois (!!) et en déclarant la variable comme bool ou _Bool plutôt que Boolean ou BOOL. Le type _Bool de C99 (synonyme de bool lorsque vous incluez stdbool.h) force sa valeur à être 1 ou 0, tout comme les solutions == et !!.

+0

Merci, Peter. Cela explique extrêmement bien et résout mon problème. – the979kid

+0

Un grand merci, savez-vous s'il y a un moyen de vérifier si un modificateur est pressé? Ou devrais-je vérifier explicitement comme ça pour chacun? –

+0

Je l'ai fait mais je ne sais pas si c'est le meilleur/le plus propre? 'BOOL isModifierPressed = (flags & (kCGEventFlagMaskAlternate | kCGEventFlagMaskCommand | kCGEventFlagMaskControl | kCGEventFlagMaskShift))> 0; ' –

Questions connexes