В Applescript, как я могу узнать, выбран ли какой-либо пункт меню? - PullRequest
5 голосов
/ 16 сентября 2008

У меня есть скрипт для 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 процесса приложения «Редактор скриптов» приложения «Системные события»}.

Так есть ли способ заставить мой скрипт определить, сфокусировано ли поле поиска?


Я решил свою проблему, обойдя ее . Я до сих пор не знаю, как проверить, выбран ли пункт меню, поэтому я оставлю эту тему открытой.

Ответы [ 4 ]

4 голосов
/ 18 сентября 2008

Встроенная комбинация клавиш Cmd -? ( Cmd-Shift - / ) уже ведет себя так. Он перемещает фокусировку клавиш в поле поиска меню справки, если оно еще не сфокусировано, и в противном случае закрывает меню.

3 голосов
/ 11 марта 2016

Вам необходимо использовать атрибут 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.

Примечание. Этот тест работает только в том случае, если приложение, меню которого проверяются, в настоящее время frontmost .

2 голосов
/ 16 сентября 2008

Используя / Developer / Applications / Utilities / Accessibility Tools / Accessibility Inspector.app, вы можете использовать встроенную систему специальных возможностей, чтобы просматривать свойства элемента пользовательского интерфейса под мышью. Обратите особое внимание на действие cmd-F7, чтобы заблокировать фокус на элементе и кнопку Обновить. К сожалению, имена элементов и свойств не совпадают напрямую с именами в наборе сценариев, но вы можете посмотреть словарь системных событий или, как правило, угадать правильную терминологию.

Используя это, вы можете определить две вещи. Во-первых, свойство focused находится не на menu item, а на 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 снова кажется намного проще.

1 голос
/ 10 октября 2009

Я только что столкнулся с необходимостью сделать это самостоятельно для некоторой обработки файлов в 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

Готово.

Это сработало без проблем и может быть использовано для итерации файла. Вероятно, мне придется делать это много раз в моей будущей автоматизации.

Удачи!

...