ここでは、キーマクロユーティリティーの「KeyQuencer」をAppleScriptから利用する方法と注意点を述べます。
概要 KeyQuencerは、コントロールパネル「KeyQuencer」と機能拡張書類「KQ Apple Events」、機能追加書類からなります。「KQ Apple Events」はバックグラウンド・アプリケーションであり、これに対してAppleScriptから命令を出すことになります。
「KQ Apple Events」は、「Do Script」という命令のみをサポートしています。この命令はAppleScriptにマクロを内蔵しているアプリケーションが簡易にスクリプト対応するための命令で、アプリケーション応答を返しません。従って、KQ Apple Eventsの処理が終了したかどうかをスクリプト側から知ることはできないことになります。
スクリプトから利用する際の書式は以下の通り。
tell application "KQ Apple Events" Do Script "macro text" end tellテキスト部分にはKeyQuencerのマクロスクリプトをそのまま記述します。
註)「"」は「\"」と書く必要があります。例えばあるスクリプト非対応アプリケーションで「ペースト」命令を実行するときは、次のように書きます。
tell application "KQ Apple Events" Do Script "key cmd \"v\"" end tellKQのマクロスクリプト中ではTabは無視されますので、自由にインデントできます。
注意点 AppleScriptからKQのマクロスクリプトを実行する際の注意点は、命令の実行順が必ずしもスクリプトに書いたとおりにはならないということです。
例えば次のようなスクリプトがあったとします。
on run (命令A) tell application "KQ Apple Events" Do Script "(命令B) (命令C)" end tell (命令D) end run一見すると、このスクリプトの実行順は「A→B→C→D」となりそうですが、実際にそうなるかどうかは実行してみなければ分かりません。例えば「A→B→D→C」になることも十分に考えられます。
これは、KQ Apple Eventsがアプリケーション応答を返さないことに原因があります。
一般的に言って、AppleScriptからスクリプタブルなアプリケーションに命令を出すと、命令を受け取った側はその実行結果(または単に実行終了のメッセージやエラー)をスクリプトに返します。スクリプトはアプリケーションからの応答があるまでスクリプトを停止し、応答を受け取った時点で実行を再開します。このためスクリプタブルなアプリケーションに対する命令は、常にスクリプトに記述されたとおりになります。
しかしKQ Apple Eventsは応答を返さないため、スクリプトはKQのマクロ実行を待たずにその先の命令を実行してしまいます。この結果、命令の記述されている順番と、実際に実行される順番とが食い違ってしまうわけです。
実行順が確実なのは、AppleScript命令同士やマクロ命令同士です。上の例で言うと、「A→D」や「B→C」は確定しています。二つの命令の順序としては「A→B」も確かですね。ただし「B→D」の順になるとは限りません。全体で言えば「A→D→B→C」になる可能性もあります。
これを避けるためには、KQへの命令の後、スクリプトを一旦停止する必要があります。
on run (命令A) tell application "KQ Apple Events" Do Script "(命令B) (命令C)" end tell repeat 1000000 times end repeat (命令D) end runこうすることで、KQへ命令を出してから次の命令(D)を出すまでに時間を取ることができます。繰り返しの回数は次の命令のタイミングに合わせて調節する必要があります。
もっともこの方法では、待っている間のCPU負荷が大きいため、KQの実行速度が低下してタイミングがよけいに取りづらいという点が問題になります。また、CPUの性能によって待ち時間が異なるため、スクリプトの汎用性は低下します。
スクリプトを指定時間アイドリングする方法としては、専用のOSAXを利用するというのも一つの手段です。例えば「WaitTicks」ではtick(1/60秒)単位で待ちをかけることができます。
KQをスクリプトから利用する際には、まず行いたい処理が他の方法で可能かどうかをよく検討し、どうしても不可能な場合にのみ利用するという姿勢が大事だと思います。KQをスクリプトから安心して利用できるのは、スクリプトの最後にキーマクロを使用するときだけなのですから。