GUI Scripting的なUI Elementへの参照をもとに、そのUI Elementが所属するアプリケーション名を取得するAppleScriptです。
こんな、Safariの「ファイル」メニューの中にあるメニュー項目、
menu item “PDFとして書き出す…” of menu “ファイル” of menu bar item “ファイル” of menu bar 1 of application process “Safari”
があったとして、このオブジェクトが所属しているアプリケーション名を取得したいというケースがありました。上記の例では「Safari」がそれに該当します。
GUI Scripting的なお約束として、オブジェクト階層が上から下に向かって取得する場合には「entire contents」でまとめて取得できるのですが、下から上に向かってparentで取得できるわけでもなく、アプリケーションプロセス名をさかのぼって取得するといった処理ができていませんでした。
AppleScriptの「仕様」的には不可能です。
でも、不可能であることさえわかれば(正攻法では不可能なので)、いつものトリッキーかつ邪道な手口でなんとかなりそうです。
そうです、エラートラップ中で無理やりエラーを起こして、そのエラーメッセージの情報から取得してしまおうという、いつものやつです。
というわけで、GUI Elementの情報から所属アプリケーション名を取得できました。
最近は、さらなる「卑劣な手段」を用意しているので、そちらで華麗かつ卑劣に処理してもよかったのですが、とりあえず手短にまとめたかったのでいつものやつで処理しました。
AppleScript名:GUI Scripting的なUI Elementへの参照から所属するアプリケーション名を取得する.scptd |
— – Created by: Takaaki Naganoya – Created on: 2018/09/17 — – Copyright © 2018 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions tell application "System Events" set aRef to menu item "PDFとして書き出す…" of menu "ファイル" of menu bar item "ファイル" of menu bar 1 of application process "Safari" end tell set appName to retRootAppProcessNameFromGUIElementRef(aRef) of me –> "Safari" –GUI Scripting的なUI Elementへの参照から、rootのアプリケーションプロセス名を取得する on retRootAppProcessNameFromGUIElementRef(aRef) try set aStr to aRef as string –force cause error on error erM set offsetA to offset of " of application \"System Events\"" in erM set offsetB to offset of "«class pcap» " in erM set appName to text (offsetB + (length of "«class pcap» ") + 1) thru (offsetA – 2) of erM return appName as string end try end retRootAppProcessNameFromGUIElementRef |