В Applescript, как я могу узнать, выбран ли пункт меню / сфокусирован?

StackOverflow https://stackoverflow.com/questions/69030

  •  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

Выполнено.

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

Удачи вам!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top