2020-02-28T10:35:35+09:00

System Event を使わないで キータイプ する AppleScript

macOS 10.14 Mojave から、あるアプリケーションから別のアプリケーションに Apple Event を送る際に、最初の1回はダイアログが開かれて承認を求められるようになりました。これがうっとうしい。最初の一回ぐらい、いいじゃないかと思うかもしれないけど、スクリプトを編集するたびに承認がリセットされるんです。使うだけなら、最初の一回だけかもしれないけど、開発している時は毎回承認が求められることになり、とてもうっとうしい。

というわけで、JavaScript for Automation (JXA) を使って、AppleScript からは実行できない C 言語の API を呼び出して、Apple Event の送信を回避しようという話です。

一般にアプリケーションのコントロールには、キータイプのエミュレーションは不確実なので避けるべきですが、他に手段がない場合もありますね。例えば、アプリケーションを選ばす文字列を入力する方法として、

  1. クリップボードに文字列を挿入
  2. Command + V のキータイプをエミュレート

という方法が考えられます。

AppleScript からキータイプをエミューレートする正規の方法は、アプリケーション System Events を使う(Apple Event を送信する)方法ですね。同等のことを、JXA から CoreGraphics の API を呼び出して、行います。次のスクリプトは Command + V をエミュレートしています。他のキータイプに変更するには、KVK_ANSI_V とか KCGEventFlagMaskCommand というところを変えていただければ良いです。

なお、このスクリプトの実行には、GUI Scripting が利用可能になっている必要があります。先日紹介した、GUI Scirpting をチェックするスクリプトと合わせて利用してください。

以下のスクリプトは不完全なので、「System Event を使わないで キータイプ する AppleScript の修正版」を参照してください。

on press_command_V()
run script "ObjC.import('Carbon');
const source = $.CGEventSourceCreate($.kCGEventSourceStateHIDSystemState);
const kev = $.CGEventCreateKeyboardEvent(source, $.kVK_ANSI_V, true);
$.CGEventSetFlags(kev, $.kCGEventFlagMaskCommand);
$.CGEventPost($.kCGHIDEventTap, kev);" in "JavaScript"
end press_command_V

press_command_V()