web-dev-qa-db-ja.com

アプリケーションのロードが完了するまでAppleScriptを待機させます

私は自分の作業環境を開始するためのアップルスクリプトを持っていますが、それについて少し疑問があります。スクリプトでいくつかのプログラムを起動し、起動したら非表示にします。現在、コードは次のようになっています。

tell application "Firefox" to activate

delay 0.5

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

明らかに、delay 0.5は単なるプレースホルダーです。理想的には、プログラムの読み込みが完了したらすぐに非表示にします。残念ながら、ロード時間は大きく異なります(0.2〜5秒)。コールバックやアプリケーションのイベントを監視する関数のようなものはありますか?

7
Christian Macht

ループ内の可視性ステータスをクエリし、機能するまで非可視に設定することを繰り返します。

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

AppleScript Editorのイベントログを監視すると、数回の試行が必要になる可能性があることは明らかです。 Xcodeで試してみると、次のことが1490回繰り返されました。

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

それが最終的に機能する前に:

set visible of process "Xcode" to false
get visible of process "Xcode"
    --> false
6
Daniel Beck

通常、遅延を追加する必要はありませんが、この場合、visibileプロパティをfalseに設定しても、アプリケーションが開き終えるとtrueに戻ります。そのため、その値やプロセスが存在するかどうかを確認することはできません。

launchまたはopen -jgを使用して、ウィンドウが表示されていないアプリケーションを開くことができます。 launchは、アプリケーションが以前に開かれていなかった場合、新しいウィンドウを開きます。 open -jgは、アプリケーションは開いているが表示されているウィンドウがない場合に、新しいウィンドウを開きます。

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

Alfred、Growl、nvALT、The Unarchiver、X11などのいくつかのアプリケーションは、どちらでも動作しませんでした。 visibleをfalseに設定する前に、固定の遅延を追加する必要がある場合があります。

2
Lri