我经常需要创建一个 GUI 脚本来访问应用程序中的菜单项,这些应用程序的 AppleScript 库不提供对菜单项所代表的对象或功能的直接访问。为了便于重用代码,我使用变量来表示应用程序、菜单和菜单项名称。然后我只需要更改顶部的变量,而不是从代码体中挑选名称。
set targetApp to "app_name"
set theMenu to "menu_name"
set theItem to "menu_item_name"
tell application targetApp
activate
tell application "System Events"
tell application process targetApp
tell menu bar 1
tell menu bar item theMenu
tell menu theMenu
click menu item theItem
end tell
end tell
end tell
end tell
end tell
end tell
子菜单
当涉及子菜单和子子菜单时,它会涉及更多一点,因为具有子菜单的菜单项既是其父菜单的菜单项,又是其子菜单的菜单父项。请注意,文本变量“theItem”用于指定菜单项和菜单;“targetApp”字符串变量用于引用应用程序和进程,因此在重用代码时不必在 2 个位置编辑 2 个名称。我使用此脚本运行语音命令以快速访问菜单项,而不必说,例如,“单击编辑菜单”...“单击转换”...“单击制作大写”...我添加了另一个变量对于子菜单项:
set targetApp to "app_name"
set theMenu to "menu_name"
set theItem to "menu_item_name"
set theSubItem to "sub_item_name"
tell application targetApp
activate
tell application "System Events"
tell application process targetApp
tell menu bar 1
tell menu bar item theMenu
tell menu theMenu
tell menu item theItem
tell menu theItem
click menu item theSubItem
end tell
end tell
end tell
end tell
end tell
end tell
end tell
end tell
例如:
set targetApp to "TextEdit"
set theMenu to "Edit"
set theItem to "Transformations"
set theSubItem to "Make Upper Case"
tell application targetApp
activate
tell application "System Events"
tell application process targetApp
tell menu bar 1
tell menu bar item theMenu
tell menu theMenu
tell menu item theItem
tell menu theItem
click menu item theSubItem
end tell
end tell
end tell
end tell
end tell
end tell
end tell
end tell
如果有另一个级别的子菜单,则需要一个额外的变量(例如,“theSubSubItem”),并且系统事件过程中的行告诉块将有另一个层
......
tell menu item theItem
tell menu theSubItem
click menu item theSubSubItem
end tell
end tell
...
正如本线程其他地方所述,建议在 API 中包含应用程序的对象和函数时直接寻址它们,但当 API 不提供直接访问时,寻址 GUI 作为最后的手段是有用的。缺点是 GUI 脚本可能会变得更加繁琐,并且可能必须在每次应用程序更新时进行修改。