robinets de l'événement: avec des résultats variables CGEventPost, kCGSessionEventTap, kCGAnnotatedSessionEventTap, CGEventTapPostEvent

StackOverflow https://stackoverflow.com/questions/553284

Question

Je suis en cours d'exécution dans un épineux problème avec l'affichage d'un événement à partir d'un robinet d'événement. J'écoutes pour NSSystemDefined à kCGHIDEventTap, puis en remplaçant l'événement par un nouveau. Le problème que je suis en cours d'exécution pour que selon la façon dont je posterai l'événement, il est d'être vu que par certaines applications. Mes applications de test sont Opera, Firefox, Quicksilver, et Xcode. Voici les différentes techniques que je l'ai essayé dans mon rappel du robinet de l'événement, avec des résultats. Je me attends à une action (la « réponse correcte ») de chaque application; « Bip système » rien-est-lié à cette clé de son système.

  1. Créer un nouvel événement, et le retourner à partir du rappel. Opera: aucun bip réponse / système, Firefox: aucun bip réponse / système, Quicksilver: réponse correcte, Xcode: aucun bip réponse / système

  2. Créer un nouvel événement, après à kCGSessionEventTap avec CGEventPost, return null. Opera: aucun bip réponse / système, Firefox: aucun bip réponse / système, Quicksilver: réponse correcte, Xcode: aucun bip réponse / système

  3. Créer un nouvel événement, après à kCGAnnotatedSessionEventTap avec CGEventPost, return null. Opera: réponse correcte, Firefox: réponse correcte, Quicksilver: pas de réponse / bip système, Xcode: aucun bip réponse / système

  4. Créer un nouvel événement, après avec CGEventTapPostEvent, return null. Opera: aucun bip réponse / système, Firefox: aucun bip réponse / système, Quicksilver: réponse correcte, Xcode: aucun bip réponse / système

  5. Créer un nouvel événement, après à kCGSessionEventTap avec CGEventPost et retour nouvel événement. Opera: aucun bip réponse / système, Firefox: aucun bip réponse / système, Quicksilver: réponse correcte, Xcode: aucun bip réponse / système

  6. Créer un nouvel événement, après à kCGAnnotatedSessionEventTap avec CGEventPost et retour nouvel événement. Opera: réponse correcte et le signal sonore du système, Firefox: réponse correcte et le signal sonore du système, Quicksilver: réponse correcte et bip système, Xcode: pas de réponse / double bip système

  7. Créer un nouvel événement, ajouter un commentaire avec CGEventTapPostEvent et retour nouvel événement. Opera: aucun bip réponse / système, Firefox: aucun bip réponse / système, Quicksilver: réponse correcte, Xcode: aucun bip réponse / système

(6) est le meilleur, mais les utilisateurs se plaignent du signal sonore du système supplémentaire sur les réponses correctes, que je devine vient du double affichage de l'événement. Je ne suis pas sûr d'autres combinaisons pour essayer, ou quel autre endroit à regarder. Quelqu'un peut-il offrir toute orientation? Est-il possible d'obtenir les résultats des deux retour de l'événement de mon rappel et l'affichage au robinet annotée sans faire les deux?

Désolé pour la longue question; Je fais beaucoup d'expérimentation.

Merci d'avance


Mise à jour: c'est le code que j'utiliser pour créer le robinet d'événement:

CFMachPortRef eventTap;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0,CGEventMaskBit(NX_SYSDEFINED) | (1 << kCGEventKeyDown) | (1 << kCGEventKeyUp), myCGEventCallback, (void *)hidEventQueue);
Était-ce utile?

La solution

Je pense que je fixe cela. J'avais utilisé +[NSEvent keyEventWithType:location:modifierFlags:timestamp:windowNumber:context:characters:charactersIgnoringModifiers:isARepeat:keyCode:] pour créer un NSEvent, puis retourner la -CGEvent de cet événement. Je suis passé à CGEventCreateKeyboardEvent, en utilisant la source d'événement créé à partir de l'événement d'origine avec CGEventCreateSourceFromEvent, et le retour de l'événement du rappel. Tous mes tests passent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top