2009-02-16 4 views
3

Je rencontre un problème épineux avec l'affichage d'un événement à partir d'un événement. Je sélectionne NSSystemDefined sur kCGHIDEventTap, puis remplace l'événement par un nouveau. Le problème auquel je suis confronté est que, selon la façon dont je publie l'événement, il est vu uniquement par certaines applications. Mes applications de test sont Opera, Firefox, Quicksilver et Xcode. Voici les différentes techniques que j'ai essayées au cours de mon événement tap back, avec des résultats. J'attends une action (la "réponse correcte") de chaque application; "bip système" signifie le son du système rien-lié-à-ce-clé.Tarauds d'événements: résultats variables avec CGEventPost, kCGSessionEventTap, kCGAnnotatedSessionEventTap, CGEventTapPostEvent

  1. Créez un nouvel événement et renvoyez-le à partir du rappel. Opera: pas de réponse/bip système, Firefox: pas de réponse/bip système, Quicksilver: réponse correcte, Xcode: pas de réponse/système sonore

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

  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: pas de réponse/système sonore

  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: pas de réponse/système sonore

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

  6. Créer un nouvel événement, après à kCGAnnotatedSessionEventTap avec CGEventPost, et le 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, après avec CGEventTapPostEvent et retour nouvelle un événement. Opera: pas de réponse/bip système, Firefox: pas de réponse/bip système, Quicksilver: réponse correcte, Xcode: pas de réponse/système sonore

(6) est le meilleur, mais les utilisateurs se plaignent du supplément bip du système 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 à essayer, ou d'ailleurs à regarder. Quelqu'un peut-il offrir des conseils? Y a-t-il un moyen d'obtenir les résultats du retour de l'événement de mon rappel et de la publication sur le robinet annoté sans faire les deux?

Désolé pour la longue question; J'ai fait beaucoup d'expérimentation.

Merci à l'avance


Mise à jour: c'est le code que j'utilise 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); 
+0

Pouvez-vous montrer le code où vous créez le robinet? –

Répondre

2

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 renvoyer -CGEvent de cet événement. Je suis passé à CGEventCreateKeyboardEvent, en utilisant la source d'événement créer à partir de l'événement d'origine (avec CGEventCreateSourceFromEvent) et en renvoyant l'événement à partir du rappel. Tous mes tests passent maintenant.

Questions connexes