AppleScript erhalten aktive Anwendung

13

Wie kann ich Code (zum Beispiel display dialog("test")) mit AppleScript nur ausführen, wenn die "Finder" -Anwendung derzeit im Fokus / aktiv ist?

Wilhelm
quelle
Was möchten Sie erreichen, wenn die Anwendung bereits aktiv ist, indem Sie sie erneut aktivieren?
Kent,
stackoverflow.com/questions/3718520/… idle ist relevant, obwohl es das Problem nicht löst.
William
Sie müssen Ihre Frage klären. Das Skript in meiner Antwort funktioniert für eine gegebene Definition von "funktioniert", dh es gibt genau an, ob Finder an vorderster Stelle steht oder nicht.
Tetsujin
@ Tetsujin aktualisiert
William
Wie werden Sie die Applescript-App starten? Wenn Sie darauf doppelklicken, wird der Finder natürlich immer als "Vorletzter" angezeigt. Ändern der Antwort - dies funktioniert, wenn es vom Skript-Editor aufgerufen wird, aber "schlägt fehl", wenn im Finder doppelt geklickt wird, da es ein falsch-positives
Ergebnis

Antworten:

18

Dies funktioniert, wenn das Skript vom Skript-Editor aus aufgerufen wird, da es „aus dem Weg geht“, um die nächste App in der Zeile zu überprüfen. Wenn Sie im Finder doppelt darauf klicken, schlägt dies fehl, da der Finder dann immer in der letzten Zeile ist.

tell application "System Events"
    set frontmostProcess to first process where it is frontmost
    set visible of frontmostProcess to false
    repeat while (frontmostProcess is frontmost)
        delay 0.2
    end repeat
    set secondFrontmost to name of first process where it is frontmost
    set frontmost of frontmostProcess to true
end tell

tell application (path to frontmost application as text)
    if "Finder" is in secondFrontmost then
        display dialog ("Finder was last in front")
    else
        display dialog (secondFrontmost & " was last in front")
    end if
end tell

Lassen Sie die vorherige Antwort hier für die Nachwelt

Komplette Antwort neu zusammengestellt, nachdem die Frage anfangs nicht richtig gelesen wurde ;-)

tell application "System Events"
    set activeApp to name of first application process whose frontmost is true
    if "Finder" is in activeApp then
        display dialog ("test")
    else
        display dialog ("test2")
    end if
end tell
Tetsujin
quelle
+1 Obwohl Ihre vorgeschlagene Lösung nicht so zu funktionieren scheint, wie sie ist. Ich erhalte "test", solange die Anwendung geöffnet ist und nicht unbedingt, ob sie aktiv ist oder nicht.
William
Ein Umdenken ... bearbeitete Antwort
Tetsujin
Vollständiges Neuschreiben, jetzt bin ich wieder auf meinem Desktop - das macht jetzt genau das, wonach Sie gefragt haben.
Tetsujin
2
Sie können auch den zweiten Dialogbefehl durch ersetzen display dialog (activeApp), um genau zu bestätigen, was das Skript für das vorderste hält.
Kent
1
Gehen Sie dabei vorsichtig vor - die Namen einiger Apps (z. B. tell application "app_name") unterscheiden sich von den Prozessnamen (z set frontmost of process "app_process" to true. B. ).
BallpointBen