ネット上に転がっていたサンプルコードをかき集めて作ったmouseClick.frameworkを用いて指定座標のクリックを行うAppleScriptです。
# ご注意:マウスカーソルの移動やクリックを行うのは、本来のAppleScriptの処理ではありません
# ご注意:他のマシン上で同じ動作を再現することが(初心者には)難しいため、おすすめしません
強制的なマウスカーソル移動とクリック(プレスともいいますね)は、「仕方なくほかに方法がなくなった場合」の、アプリケーション操作の最終手段です。やらないに越したことはない「必要悪」ともいえます。Automatorの作業記録機能が「クリック座標を記録する」という仕組みで実装されているため、AutomatorからAppleScriptに移ってきたユーザーがその調子で組もうとしてドツボにハマる姿がたまに見られます。
step1: 対象のGUIアプリケーションがAppleScript対応であれば、AppleScript用語辞書を調べて、目的の機能が呼び出せるかを確認する
step2: 対象のGUIアプリケーションの特殊機能(Custom URL Protocolなど)で目的の機能が呼び出せないかを確認する(URL Protocolだと非同期実行なので、あまり当てにならないので役に立たないケース多し)
→ とくに、Maps.appではURL Protocol経由で、しかもCustom URL schemeでもなく、http://maps.apple.comで操作するようになっています
step3: step1,2で目的の機能が呼び出せないことがわかったら、GUI Scripting経由で(メニューやボタンを操作して)呼び出せないかを試す
step4: step3でもどうしても呼び出せない場合に、GUI Scriptingで座標を指定してクリックイベントを送るという操作をためす
step5: ごくまれに、step4でも操作できないアプリケーションがある。AdobeのCreativeアプリケーションはポップアップメニューの内容を毎回プログラムから再生成していたりして、これがGUI Scriptingでも操作できない事態を引き起こす。この段階でマウスの強制移動とクリックの使用が検討される
これまで、古い仕組みを使ってマウスカーソル移動とクリックを行なっていましたが、とうとうmacOS 10.13で動かなくなり(これはバグではなく仕方ない話。OS X 10.6あたりでDeprecatedになったので)、代替手段を探していました。
CGEventRef mousedown = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, point, kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, mousedown);
CGEventRef mouseup = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, point, kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, mouseup);
こんな感じでカーソル移動とクリックを行なっています。サンプルコードではCGPointでパラメータを受け渡していましたが、AppleScriptから呼びやすいようにNSPointで座標値を受け渡すよう書き換えてみました。
本Framework+AppleScript「mouseClickを用いて指定座標をクリック v2」はmacOS 10.13上で動きます。
–> mouseClick.framework (To ~/Library/Frameworks/)
後日談:
なぜか、CGPostMouseEventの機能はmacOS 10.14でふたたび使えるようになり、macOS 12上でも動作しています。deprecatedとは?
AppleScript名:mouseClickを用いて指定座標をクリック v2 |
— Created 2018-03-10 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use framework "mouseClick" use scripting additions my clickAt(100, 10) on clickAt(newX, newY) |
AppleScript名:ASOCでマウスの強制移動とクリック(macOS 10.12まで) |
— Created 2015-10-04 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" –max version macOS 10.12 use scripting additions use framework "Foundation" use framework "ApplicationServices" use framework "Quartz" my clickAt(100, 10) on clickAt(newX, newY) |