Événements déplacés avec la souris dans le cacao
-
06-07-2019 - |
Question
Existe-t-il un moyen de s'inscrire aux événements globaux déplacés avec la souris dans Cocoa? Je pouvais m'inscrire aux événements en utilisant Carbon InstallEventHandler()
, mais préférerais un équivalent à Cocoa. J'ai recherché NSNotificationCenter
des événements, mais il ne semble pas y avoir de noms d'événements publics (existe-t-il des noms privés?)
Sinon, existe-t-il un moyen d'utiliser NSTrackingArea
les vues avec un clearColor
arrière-plan?
L'application est uniquement pour Snow Leopard.
La solution
Dans SnowLeopard, il existe une nouvelle méthode de classe sur NSEvent
qui fait exactement ce que vous voulez: + (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block
. Vous & # 8217; vous voudrez mask = NSMouseMovedMask
.
Autres conseils
Une question similaire avait déjà été posée sur StackOverflow: Comment créer un handle de sous-classe NSView transparent Événements de souris?
Pour résumer, la méthode de la vue par transparence ne fonctionnait pas. Les tapotements d’événement Quartz semblent être la meilleure réponse.
Voici quelques astuces pour travailler avec les robinets:
-
Créez le robinet avec
CGEventTapCreate
.
a) Pour le paramètre (premier) lieu que vous voudrez probablement utiliserkCGSessionEventTap
.
b) Pour le paramètre placement (deuxième), vous voudrez probablementkCGHeadInsertEventTap
.
c) Pour le paramètre de masque d'événement, essayez(1 << kCGEventMouseMoved)
. -
Créez une source de boucle d'exécution avec
CFMachPortCreateRunLoopSource
, en transmettant l'événement en tant que second paramètre. -
Ajoutez la source de la boucle d'exécution à votre boucle d'exécution. En supposant que vous vouliez l'ajouter à la boucle d'exécution principale, faites:
CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);
-
Activer l'événement taper avec
CGEventTapEnable
Si vous voulez suivre la souris, peu importe où elle se trouve, vous voulez un CGEventTap. Il n'y a pas d'équivalent cacao. Si vous souhaitez simplement le suivre dans votre application, vous devez expliquer pourquoi vous vous trouvez incapable de le faire de manière plus approfondie.