Lassen Sie AppleScript warten, bis eine Anwendung vollständig geladen ist

7

Ich habe ein Applescript, um meine Arbeitsumgebung zu initiieren, habe aber einen kleinen Streit damit. Ich möchte, dass das Skript mehrere Programme startet und sie dann ausblendet, sobald sie gestartet sind. Der Code sieht derzeit folgendermaßen aus:

tell application "Firefox" to activate

delay 0.5

tell application "Finder"
  set visible of process "Firefox" to false
end tell

Offensichtlich ist Verzögerung 0,5 nur ein Platzhalter. Idealerweise möchte ich das Programm ausblenden, sobald es vollständig geladen ist. Leider variieren meine Ladezeiten stark (von 0,2 bis 5 Sekunden). Gibt es so etwas wie einen Rückruf oder eine Funktion zur Überwachung der Ereignisse von Anwendungen?

Christliche Macht
quelle
Warum nicht einfach open -aw Firefoxdie App mit AppleScript anrufen und dann ausblenden?
Slhck
@slhck Sorry, ich verstehe nicht. Parameter -aerfordert das Öffnen einer bestimmten App und -Wwartet, bis die geöffnete App geschlossen wird. Mein Verständnis man openist, dass es keine Optionen gibt, die dafür nützlich sein könnten?
Christian Macht
Hoppla, sorry, das habe ich falsch verstanden.
Slhck

Antworten:

6

Fragen Sie den Sichtbarkeitsstatus in einer Schleife ab und wiederholen Sie den Vorgang, um ihn unsichtbar zu machen, bis er funktioniert:

set appname to "Firefox"
tell application appname to launch
tell application "System Events"
    repeat until visible of process appname is false
        set visible of process appname to false
    end repeat
end tell

Bei der Überwachung des Ereignisprotokolls von AppleScript Editor ist es offensichtlich, dass einige Versuche erforderlich sind. Folgendes wurde 1490 Mal wiederholt, als ich es mit Xcode versuchte:

set visible of process "Xcode" to false
get visible of process "Xcode"
    --> true

Bevor es endlich funktionierte:

set visible of process "Xcode" to false
get visible of process "Xcode"
    --> false
Daniel Beck
quelle
Großartig, das funktioniert! Ich musste eine Verzögerung hinzufügen, bevor System Events seine Überprüfungen durchführt, oder es würde zurückgeben -> true, bevor Firefox überhaupt geöffnet wurde (langsame Maschine;)). Gibt es jedoch keine "reibungslosere" Möglichkeit, die App nach dem Laden zurückzurufen?
Christian Macht
Es hat auch bei mir nicht funktioniert. Die Sichtbarkeit wird wieder auf true gesetzt, sobald Firefox das Öffnen abgeschlossen hat.
Lri
2

Normalerweise müssen Sie keine Verzögerungen hinzufügen. In diesem Fall wird die visibile-Eigenschaft nach Abschluss des Öffnens der Anwendung auf true zurückgesetzt, selbst wenn Sie sie auf false setzen. Sie können also den Wert nicht überprüfen oder feststellen, ob der Prozess vorhanden ist.

Sie können eine Anwendung ohne sichtbare Fenster verwenden launchoder open -jgöffnen. launchöffnet ein neues Fenster, wenn die Anwendung zuvor nicht geöffnet war. open -jgöffnet ein neues Fenster, wenn die Anwendung geöffnet ist, aber keine sichtbaren Fenster hat.

set b to "com.apple.TextEdit"
tell application "System Events"
    if bundle identifier of processes contains b then
        launch application id b
    else
        do shell script "open -jgb " & b
    end if
end tell

Einige Anwendungen wie Alfred, Growl, nvALT, The Unarchiver und X11 funktionierten mit beiden nicht. Möglicherweise müssen Sie nur eine feste Verzögerung hinzufügen, bevor Sie visibleauf false setzen.

Lri
quelle
Oh, ich wünschte, das würde funktionieren, existiert aber leider open -jnicht, zumindest am 10.6.8 / Bash 3.2.48. Auf welcher Version bist du?
Christian Macht
10.8.1. Ich weiß nicht, ob es in 10.7 oder früheren Versionen verfügbar war, aber es fehlt auf der Manpage und wird nur in der Hilfemeldung angezeigt.
Lri
Ich habe es versucht und es ist invalid option -j. Könntest du mir auch deine sagen bash -version? Es wäre darauf zurückzuführen, oder?
Christian Macht
Die Shell würde / usr / bin / open nicht beeinflussen und do shell scriptverwendet trotzdem sh.
Lri
Gibt es eine Möglichkeit für mich, die openunterstützende ausführbare Datei zu erhalten -j?
Christian Macht