2013-06-09 3 views
0

Я создаю приложение для Mac, которое должно начать диктовку (OSX 10.8). Поскольку нет возможности инициировать диктовку «непосредственно», лучший способ сделать это - через панель меню «Изменить»/«Начать диктовку», потому что у пользователя могут быть разные сочетания клавиш.Приложение какао не содержит баров меню, в соответствии с AppleScript

Вот простой скрипт, мое приложение вызовы (с помощью NSAppleScript объекта):

tell application "System Events" 
    tell application process "MyApp" 
     tell menu bar 1 
      tell menu bar item "Edit" 
       tell menu "Edit" 
        click menu item "Start Dictation" 
       end tell 
      end tell 
     end tell 
    end tell 
end tell 

Вот результаты (NSLog «d ошибку из AppleScript)

Error:-1719 System Events got an error: 
Can’t get menu bar 1 of application process "MyApp". Invalid index. 

Я сделал основной тест, чтобы посмотреть, что происходит

Мое приложение:

tell application "System Events" 
    tell application process "MyApp" 
     set x to menu bars 
     return x 
    end tell 
end tell 

result: <NSAppleEventDescriptor: [ ]> 

Finder:

tell application "System Events" 
    tell application process "Finder" 
     set x to menu bars 
     return x 
    end tell 
end tell 

result: <NSAppleEventDescriptor: [ 'obj '{ 'form':'indx', 'want':'mbar', 'seld':1, 'from':'obj '{ 'form':'name', 'want':'pcap', 'seld':'utxt'("Finder"), 'from':null() } } ]> 

Так в основном AppleScript говорит мне мое приложение не имеет строки меню? Я запускаю Accessibility Inspector, и, конечно же, есть панель меню (плюс я вижу ее ...).

Proof there actually is a menu!

Что происходит здесь не так?

ответ

0

Вы пытались активировать приложение с небольшой задержкой перед запуском системных событий? Вам также не хватает некоторых других вещей. Вот как вы это сделаете в Safari ...

tell application "Safari" to activate 
delay 1 

tell application "System Events" 
    tell process "Safari" 
     tell menu bar item "Edit" of menu bar 1 
      click 
      delay 0.5 
      tell menu item "Speech" of menu 1 
       click 
       delay 0.5 
       click menu item "Start Speaking" of menu 1 
      end tell 
     end tell 

    end tell 
end tell 

Второй пункт. Если вы сами создаете приложение, вам не нужно делать то, что вы предлагаете. Вы заявляете: «Потому что нет возможности напрямую инициировать диктовку», но почему вы так говорите? Каждый элемент меню подключается к команде, поэтому по существу вы можете подключиться к этой команде, если это ваше собственное приложение. Просто создайте кнопку или что-то в своем интерфейсе и подключите ее к той же команде, к которой подключен элемент меню. Например, я вижу в Xcode, что пункт меню «Начать разговор» подключен к команде StartSpeaking первого ответчика. Таким образом, вы можете создать кнопку или какой-либо другой элемент и подключить его к началу запуска первого ответчика в построителе интерфейса самостоятельно.

+0

Задержки не должны влиять на него по двум причинам: 1. Работает нормально с любым другим приложением, 2. Я действительно пробовал задерживать уже, безрезультатно. Кроме того, из того, что я могу сказать, элемент меню диктовки недоступен для приложений (он не отображается в меню редактирования в построителе интерфейса). Пожалуйста, поправьте меня, если я ошибаюсь. –

+0

Как уже упоминалось, начало и остановка речи - это методы первого ответа, поэтому вы можете видеть их в меню «Правка», иначе вы не сможете подключить свои собственные элементы управления к этим методам в построителе интерфейса, и если вы сможете это сделать, тогда есть также программный способ начать и прекратить говорить ... Я просто не смотрел в это. Поэтому в любом случае вы можете добавить команды в свое приложение. – regulus6633

1

Я был за чем-то подобным, я хотел активировать службу из Emacs, которая в противном случае переопределила глобальную комбинацию клавиш для службы. Другой вопрос, который я задам в другом потоке.

Выполнение приведенных выше примеров. Я обнаружил, что я должен был добавить приложение (Emacs и для тестирования Automator) в приложения Accessibility (Системные настройки -> Безопасность & Конфиденциальность -> Конфиденциальность -> Доступность). Дополнительная информация относительно этого на select-a-menu-item-in-applescript-without-using-system-events-in-10-9-maverick, а также AppleScript - uiscripting.

С этим доступом в месте, где я нахожусь в состоянии видеть пункты меню под услугой:

tell application "Emacs" 
    activate 
end tell 
tell application "System Events" 
    tell application process "Emacs" 
     tell menu bar 1 
      tell menu "Emacs"  
       tell menu item "Services" 
        tell menu "Services" 
         set x to menu items 
         click menu item "XXX" 
         return x 
        end tell 
       end tell 
      end tell 
     end tell 
    end tell 
end tell 

Но действие не активирован!

Используя приведенный выше пример, возвращается сообщение об ошибке «XXX» не существует. Замена строки правильной строкой означает, что ошибка не возникает, но действие не выполняется.