EDIT - ne pas avoir beaucoup d'entrées sur ceci, voici donc le skinny. Je poste des événements de clavier sur un PSN. Je passe ensuite à une autre fenêtre, j'envoie d'autres événements (cette fois-ci au niveau de la session tat) et je retourne à la première fenêtre. Quand je commence à poster sur le PSN, rien ne se passe. Jusqu'à ce que je bouge la souris ou la molette de défilement. Pourquoi cela serait-il le cas et comment puis-je contourner le problème (si ce n'est pas le cas)?Comportement étrange lors de la publication de CGEvent sur PSN
ORIGINAL - Si je configure une boucle qui enregistre certains événements de clavier sur un PSN, je trouve que cela fonctionne correctement, sauf lors du premier lancement. L'événement semble seulement afficher quand je fais quelque chose avec la souris manuellement - même juste en le déplaçant légèrement. Voici les détails, s'ils aident.
Une application externe possède une zone de liste de lignes de texte, que je suis en train de lire en affichant des commandes de copie (et en vérifiant la table de montage). Malheureusement, c'est mon seul moyen d'obtenir ce texte. Parfois, l'application retire le focus de la liste, que je peux détecter. Lorsque cela se produit, la manière la plus fiable de renvoyer le focus est d'envoyer un événement souris pour cliquer sur un champ de texte directement au-dessus de la liste, puis d'envoyer un événement clavier 'tabulation' pour déplacer le focus sur la liste. Donc, au lancement, la boucle tourne bien, en faisant défiler la liste et en copiant le texte. Lorsque la mise au point est décalée, elle est détectée correctement et les événements sont envoyés pour revenir à la liste. Mais rien ne semble arriver. La boucle continue de détecter que le focus a changé, mais les événements ne fonctionnent que lorsque je déplace la souris. Ou même simplement utiliser la molette de défilement. Étrange.
Une fois que cela s'est produit la première fois, cela fonctionne bien - chaque fois que le focus se déplace, les événements PSN le renvoient sans que je doive faire quoi que ce soit.
Voici le code qui fonctionne dans la boucle - vérifiée comme travail:
//copy to pasteboard - CMD-V
e3 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, true);
CGEventSetFlags(e3, kCGEventFlagMaskCommand);
CGEventPostToPSN(&psn, e3);
CFRelease(e3);
e4 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, false);
CGEventPostToPSN(&psn, e4);
CFRelease(e4);
//move cursor down
e1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)125, true);
CGEventPostToPSN(&psn, e1);
CFRelease(e1);
e2 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)125, false);
CGEventPostToPSN(&psn, e2);
CFRelease(e2);
Et voici où je passe le focus, de travail (sauf lors nécessaire) aussi:
//click in text input box - point is derived earlier
e6 = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, point, 0);
CGEventPostToPSN(&psn, e6);
CFRelease(e6);
e7 = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, point, 0);
CGEventPostToPSN(&psn, e7);
CFRelease(e7);
//press tab key to move to chat log table
CGEventRef e = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)48, true);
//CGEventPost(kCGSessionEventTap, e);
CGEventPostToPSN(&psn, e);
CFRelease(e);
CGEventRef e11 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)48, false);
CGEventPostToPSN(&psn, e11);
CFRelease(e11);
Comment basculez-vous entre les fenêtres, et les deux fenêtres sont-elles dans la même application? – drawnonward
Les deux fenêtres sont dans la même application. J'utilise AXUIElementSetAttributeValue (myWindow, kAXMainAttribute, kCFBooleanTrue); –