В Applescript, как я могу узнать, выбран ли пункт меню / сфокусирован?
-
09-06-2019 - |
Вопрос
У меня есть скрипт для OS X 10.5, который фокусирует окно поиска в меню Справки любого приложения.У меня он установлен на комбинации клавиш, и, как и Spotlight, я хочу, чтобы он переключался при запуске скрипта.Итак, я хочу определить, настроено ли окно поиска уже для ввода текста, и если да, введите Esc вместо того, чтобы нажимать меню Справки.
Вот сценарий в его нынешнем виде:
tell application "System Events"
tell (first process whose frontmost is true)
set helpMenuItem to menu bar item "Help" of menu bar 1
click helpMenuItem
end tell
end tell
И я думаю о чем-то подобном этому:
tell application "System Events"
tell (first process whose frontmost is true)
set helpMenuItem to menu bar item "Help" of menu bar 1
set searchBox to menu item 1 of menu of helpMenuItem
if (searchBox's focused) = true then
key code 53 -- type esc
else
click helpMenuItem
end if
end tell
end tell
...но я получаю эту ошибку:
Не могу сосредоточиться на {пункте меню 1 меню "Справка" строки меню пункте "Справка" строки меню 1 процесса приложения "Редактор сценариев" приложения "Системные события"}.
Итак, есть ли способ заставить мой скрипт определить, сфокусировано ли уже окно поиска?
Я решил свою проблему с помощью работаем над этим.Я все еще не знаю, как проверить, выбран ли пункт меню, поэтому я оставлю эту тему открытой.
Решение
Используя /Developer/Applications/Utilities/Accessibility Tools/ Accessibility Inspector.app, вы можете использовать встроенную систему специальных возможностей для просмотра свойств элемента пользовательского интерфейса под мышкой.Обратите особое внимание на действие cmd-F7 для блокировки фокусировки на элементе и кнопку Обновить.К сожалению, имена элементов и свойств напрямую не совпадают с именами в наборе сценариев, но вы можете заглянуть в словарь системных событий или обычно угадать правильную терминологию.
Используя это, вы можете определить две вещи.Во-первых, focused
собственность не находится на menu item
, но скорее всего существует text field
в пределах menu item
это целенаправленно.Во-вторых, пункт меню имеет selected
собственность.
С этим я пришел к выводу:
tell application "System Events"
tell (first process whose frontmost is true)
set helpMenuItem to menu bar item "Help" of menu bar 1
-- Use reference form to avoid building intermediate object specifiers, which Accessibility apparently isn't good at resolving after the fact.
set searchBox to a reference to menu item 1 of menu of helpMenuItem
set searchField to a reference to text field 1 of searchBox
if searchField's focused is true then
key code 53 -- type esc
else
click helpMenuItem
end if
end tell
end tell
Хотя это все равно не работает.Ключевое событие, насколько я могу судить, не срабатывает, так что что-то все еще может быть не так с focused
свойство в текстовом поле.
Во всяком случае, ваш click
опять же, решение кажется намного проще.
Другие советы
Встроенное сочетание клавиш Cmd-? (Cmd-Сдвиг-/) уже ведет себя подобным образом.Он перемещает фокус клавиши на поле поиска меню справки, если оно еще не сфокусировано, и в противном случае закрывает меню.
Вам нужно использовать атрибут AXMenuItemMarkChar
.
Пример:
tell application "System Events"
tell process "Cisco Jabber"
set X to (value of attribute "AXMenuItemMarkChar" of menu item "Available" of menu "Status" of menu item "Status" of menu "File" of menu bar item "File" of menu bar 1) is "✓" -- check if Status is "Availible"
end tell
end tell
Если пункт меню отмечен, возвращаемое значение равно ✓
, в противном случае это missing value
.
Примечание:Этот тест работает только в том случае, если приложение, меню которого проверяется, в данный момент самый передний.
Я только что столкнулся с необходимостью сделать это самому для некоторой обработки файлов в Illustrator.
Вот что у меня получилось:
tell application "Adobe Illustrator"
activate
tell application "System Events"
tell process "Illustrator"
set frontmost to true
set activeMenuItem to enabled of menu item "Unlock All" of menu "Object" of menu bar item "Object" of menu bar 1
if activeMenuItem is true then
tell me to beep 3
else
tell me to beep 2
end if
end tell
end tell
end tell
Выполнено.
Это работало без проблем и могло быть использовано для повторения файла.Вероятно, мне придется проделывать это еще много раз при моей будущей автоматизации.
Удачи вам!