0 votes

Comment arrêter la répétition en cliquant hors de la fenêtre active ou en appuyant sur une touche à l'aide d'AppleScript ?

J'essaie d'écrire un AppleScript qui répète une action jusqu'à ce que vous appuyiez sur une touche ou que vous cliquiez hors de la fenêtre active. Comment dois-je m'y prendre ?

repeat repeatTimes times
tell application "System Events"

    keystroke firstText
    keystroke return
    delay firstDelay

    keystroke secondText
    keystroke return
    delay secondDelay

end tell
end repeat

je préfère modifier repeat repeatTimes times a until keypress (n'importe quelle touche) ou until app not active ou autre chose. Des idées ?

2voto

OnePablo Points 1

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.

0voto

Mateusz Szlosek Points 21762

Vous pouvez faire quelque chose comme :

-- Get current active app
tell application "System Events"
    set activeApp to name of first application process whose frontmost is true
end tell

set repeatValue to false
repeat until repeatValue
    tell application "System Events"
        set newActiveApp to name of first application process whose frontmost is true
        if newActiveApp is not in activeApp then
            set repeatValue to true -- stop the loop
        end if

        log "Repeating"
    end tell
end repeat

Vous pouvez donc vérifier l'application active en cours et décider si vous voulez arrêter la boucle.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X