2015-08-14 2 views
3

J'ai le code suivant dans un démon (processus racine) qui simule des événements de clavier dans OSX. Lorsque je suis dans User1 et que le démon est chargé dans le contexte Root, les événements du clavier sont simulés. Quand je passe à User2, tous les événements sauf la touche Shift sont exécutés avec succès. Pour une raison quelconque, l'événement de clavier pour la touche Maj est exécuté dans Utilisateur1 bien que je suis actuellement connecté à Utilisateur2.Exécution d'événements de clavier à partir du démon dans Mac à l'aide de CFEvents

J'ai aussi essayé avec l'utilisation du masque à décalage:

CGEventRef event1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)keyCode, true);//'z' keydown event 
CGEventSetFlags(event1, kCGEventFlagMaskShift);//set shift key down for above event 
CGEventPost(kCGHIDEventTap, event1);//post event 
CFRelease(event1); 

Cela fonctionne aussi bien dans le User1. Lorsque je passe à user2, et que j'effectue les événements clés comme indiqué ci-dessus, il effectue ces événements dans l'application la plus en avant dans User1. Les événements pour la touche Shift ou n'importe quelle touche avec le masque Shift vont à User1, et non à l'utilisateur actuellement connecté

Est-ce que je peux garantir que les événements du clavier sont exécutés dans l'utilisateur connecté?

Répondre

1

Après avoir créé votre keyEvent, définissez les indicateurs de modification avant de poster:

CGEventFlags flags = kCGEventFlagMaskShift; 
CGEventSetFlags(keyEvent, modifierFlags); 
+0

Cela ne fonctionne pas non plus. Si j'envoie un événement clé pour 'a', avec masque de décalage, il ne l'exécute pas dans l'utilisateur 2. Au lieu de cela, il tape 'A' dans l'application la plus en avant dans l'utilisateur 1. –

+0

Pourriez-vous modifier votre question pour afficher plus de code de la façon dont vous ajoutez votre masque de changement de vitesse? –

+0

A édité la question –