Applescript для автоматического закрытия диалогового окна после ввода? - PullRequest
0 голосов
/ 27 июля 2011

Хорошо, поэтому я пишу appleScript, чтобы выполнить некоторые действия по управлению голосом для меня.

Я использую Dragon Dictate 2.0 для Mac для своего голосового управления и в основном яблочный скрипт для своего кодирования. У меня есть все в значительной степени в квадрате, за исключением одного мелкого вопроса. Когда я ожидаю голосовую команду, у меня в applecriptcript отображается диалоговое окно для ввода текста.

например.

set cmd1 to the text returned of (display dialog "Speak Command:" default answer "")

Отображается диалоговое окно с пустым текстовым полем и кнопками «отмена» и «ок»

Моя проблема в том, как я могу нажать ОК, не произнося дополнительную фразу. В настоящее время у меня есть голосовая команда, которая слушает меня, чтобы сказать «иди», а затем запускает appleScript, который нажимает клавишу «возврата». Это работает, но я не хочу говорить «иди».

Я знаю, что могу добавить

giving up after 10

для автоматического закрытия диалогового окна и принятия ввода через определенный промежуток времени, но должен быть лучший способ.

Я провел некоторое исследование и обнаружил, что мог бы иметь обработчик событий для «при завершении редактирования», чтобы выполнить нажатие клавиши возврата. Но я понятия не имею, как это сделать. Если у кого-то есть вклад или идеи, это было бы здорово. Спасибо!

1 Ответ

0 голосов
/ 27 июля 2011

Лучше всего использовать «готовое редактирование», но тогда вам придется написать свое диалоговое окно в Xcode, используя target-c или AppleScriptObjC.Кажется, это за пределами ваших способностей.

Что-то, что может быть в ваших силах ... вы можете смоделировать свой собственный метод "по окончании редактирования".Вы можете запустить второй appleScriptcript, когда будет запущен ваш первый appleScript, который показывает диалоговое окно.Этот второй яблочный скрипт может периодически проверять текстовое поле диалогового окна.Когда текст перестает изменяться в течение определенного периода времени, он может нажать клавишу возврата.Это немного сложно, потому что вы должны выяснить, как настроить таргетинг на свое диалоговое окно из второго яблочного сценария, но это не будет слишком сложно.Лучше всего дать вашему диалоговому окну заголовок, а затем использовать системные события, чтобы найти окно с таким заголовком.

Причина, по которой вы должны сделать это в отдельном яблочном сценарии, заключается в том, что ваш обычный яблочный скрипт приостанавливает все командыв то время как диалоговое окно открыто.Таким образом, вам нужно запустить отдельный процесс, чтобы проверить текстовое поле, и второй сценарий будет самым простым.Сначала создайте этот скрипт, который готов к редактированию.Он отклонит ваш диалог, когда пользователь перестанет вводить текст.Сохраните его как скрипт onDoneEditing на рабочем столе.

set shortDelay to 0.5
set longDelay to 1

delay longDelay --delay for a moment to let the dialog box from the first script launch

tell application "System Events"
    set theProcess to first process whose frontmost is true
    tell theProcess
        set dialogWindow to first window

        -- this repeat loop looks for when the user starts entering text into the dialog box
        repeat
            -- get the current text field value
            set currentValue to value of first text field of dialogWindow

            -- if the value has changed we know text is being entered
            if currentValue is not "" then exit repeat

            delay shortDelay
        end repeat

        -- this repeat loop looks for when the user stops entering text
        -- we know that when the text is the same after 2 checks
        delay longDelay
        repeat
            set newValue to value of first text field of dialogWindow

            if newValue is currentValue then
                keystroke return
            else
                set currentValue to newValue
            end if

            delay longDelay
        end repeat
    end tell
end tell

Теперь создайте этот скрипт.Этот скрипт запустит вышеуказанный скрипт, используя инструмент командной строки «osascript», чтобы он выполнялся в фоновом процессе.Затем он показывает диалоговое окно для вас.Вы можете прочитать мои комментарии в обоих сценариях, чтобы понять, как работает каждый из них.

-- launch the onDoneEditing script
-- we get the process id (thePID) of the launched process so we can kill it later
set onDoneEditing to (path to desktop as text) & "onDoneEditing.scpt"
set thePID to do shell script "osascript " & quoted form of POSIX path of onDoneEditing & " > /dev/null 2>&1 & echo $!"

-- diaplay the dialog and make sure it will be frontmost
tell me to activate
display dialog "Speak Command:" default answer ""

-- kill the onDoneEditing to make sure it's not still running
try
    do shell script "kill " & thePID
end try
...