2008-09-16 1 views
5

У меня есть сценарий для OS X 10.5, который фокусирует поле поиска в меню Справка любого приложения. У меня есть комбинация клавиш и, как и Spotlight, я хочу, чтобы она переключалась, когда я запускаю скрипт. Итак, я хочу определить, если окно поиска уже сфокусировано для ввода, и если это так, введите Esc вместо нажатия в меню «Справка».В Applescript, как я могу узнать, выбран ли пункт меню/сфокусирован?

Вот сценарий, как она стоит сейчас:

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 

... но я получаю эту ошибку:

Can’t get focused of {menu item 1 of menu "Help" of menu bar item "Help" of menu bar 1 of application process "Script Editor" of application "System Events"}.

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


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

ответ

2

Использование/Разработчик/Приложения/Утилиты/Специальные инструменты/Доступность 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 выглядит намного проще.

+0

`if searchField фокусируется на true, тогда` .. это действительно синтаксис сценария Apple? добавление апострофа? – abbood 2017-02-17 03:26:03

4

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

1

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

Done.

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

Удачи вам!

2

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

Смежные вопросы