Après quelques recherches, j'ai trouvé une solution à 75% à votre question. Le script ci-dessous va répéter les actions à l'intérieur de la boucle jusqu'à ce qu'une des deux assertions soit satisfaite :
La fenêtre qui a le focus maintenant est différente de la fenêtre qui avait le focus avant ;
A modificateur à partir de l'un des deux fn , , y est pressé.
J'ai essayé de trouver une solution qui permette de tester tout événement de touche enfoncée, mais je n'ai pu trouver qu'une solution impliquant les touches modificatrices. AppleScript seul ne peut pas écouter les événements clés, mais AppleScript-ObjC le peut. Peut-être qu'une autre personne sera en mesure de fournir la solution complète qui permet de surveiller toute pression de touche.
J'ai ajouté des commentaires dans le script pour vous guider dans ce que fait chaque partie. Gardez à l'esprit qu'il s'agit juste d'un exemple de script démontrant une façon possible de mettre en œuvre ces méthodes pour atteindre votre objectif :
use sys : application "System Events"
use framework "Cocoa"
set [firstText, secondText] to ["A", "B"]
set [firstDelay, secondDelay] to [0.2, 0.3]
# Open up a new TextEdit document into which
# the keystrokes can produce output
tell application "TextEdit"
activate
set D to make new document
end tell
# Get frontmost window of the frontmost application
set P to a reference to (the first process whose frontmost is true)
set W to the front window of P
# Repeat loop will break if the focussed window changes
repeat until the front window of P is not equal to W
tell sys to keystroke [firstText, return] as text
if modifierKeydown() then exit repeat # Exit on keypress
delay firstDelay
tell sys to keystroke [secondText, return] as text
if modifierKeydown() then exit repeat # Exit on keypress
delay secondDelay
if modifierKeydown() then exit repeat # Exit on keypress
end repeat
close D without saving # Close the TextEdit document
# Returns true if any of
# { function, control, option, command }
# are depressed; false otherwise
on modifierKeydown()
set __m to current application's ¬
NSEvent's modifierFlags() as any
return (__m > 262143)
end modifierKeydown
Notez que le repeat
vérifie l'état de la touche du modificateur un certain nombre de fois au cours d'une même itération. J'ai essayé de vérifier une fois, ce qui nécessitait de maintenir la touche modificatrice enfoncée pendant un certain temps jusqu'à ce que la boucle puisse arriver au point de contrôle ; et trois fois, ce qui raccourcit le temps d'attente mais au détriment du temps qui pourrait être consacré à d'autres actions dans la boucle (c'est-à-dire que cela s'ajoute aux délais déjà en place entre les commandes).
Il n'y a pas de bon ou de mauvais choix, vous devez jouer avec et voir ce qui vous convient le mieux.
De même, la vérification du focus de la fenêtre n'est effectuée qu'une fois par itération, ce qui est en fait très suffisant. Cependant, vous remarquerez que le fait de cliquer hors de la fenêtre est légèrement gêné par l'attention portée à l'exécution des actions à l'intérieur de la boucle. Ce n'est pas un problème du tout, cela fait simplement du changement de fenêtre quelque chose de plus intentionnel que la normale.
Rien de tout cela n'est surprenant, cependant, étant donné ce que ce script fait et comment il le fait.
Faites-moi savoir comment vous vous en sortez, et si vous avez des questions ou des problèmes, laissez un commentaire et je ferai de mon mieux pour vous aider.