Applescript在输入后自动关闭对话框? [英] Applescript to automatically close dialog box after input?

查看:35
本文介绍了Applescript在输入后自动关闭对话框?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,所以我正在写一个苹果脚本来为我做一些语音控制操作.

Ok, so I am writing an applescript to do some voice control actions for me.

我使用 Dragon Dictate 2.0 for mac 进行语音控制,主要使用 applescript 进行编码.除了一次小问题,我几乎把所有事情都解决了.当期待语音命令时,我让 applescript 显示一个对话框,供听写的文本使用.

I am using Dragon Dictate 2.0 for mac for my voice control and mainly applescript for my coding. I have everything pretty much squared away except for once small issue. When expecting a voice command, I have applescript display a dialog for the text to be dictated into.

例如.

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

这将显示一个带有空文本字段的对话框,以及取消"和确定"按钮

This displays a dialog box with an empty text field, and the buttons "cancel" and "ok"

我的问题是如何按确定而不必说额外的短语.目前我有一个语音命令,可以听我说go",然后运行一个按下return"键的applescript.这有效,但我不想不得不说走".

My problem is how I can press ok without having to speak an additional phrase. Currently I have a voice command that listens for me to speak "go" and then runs an applescript that presses the "return" key. This works, but I don't want to have to have to say "go".

我知道我可以添加

giving up after 10

在一定时间后自动关闭对话框并接受输入,但必须有更好的方法.

to automatically close the dialog box and accept the input after a certain time period, but there has to be a better way.

我做了一些研究,发现我可以有一个完成编辑"的事件处理程序来执行返回键击.但我不知道如何做到这一点.如果有人有任何意见或想法,那就太好了.谢谢!

I have done some research and found that I could have an event handler for "on done editing" to execute a return keystroke. But I have no idea how to do this. If anyone has any input or ideas that would be great. Thanks!

推荐答案

完成编辑"是最好的方法,但是您必须使用 Objective-c 或 AppleScriptObjC 在 Xcode 中编写对话框.看来这超出了你的能力.

The "on done editing" is the best way but then you would have to write your dialog box in Xcode using objective-c or AppleScriptObjC. It seems that is beyond your abilities.

可能在你能力范围内的东西......你可以模拟你自己的完成编辑"方法.当您的第一个显示对话框的 applescript 运行时,您可以启动第二个 applescript.第二个applescript 可以定期检查对话框的文本字段.当文本停止变化一段时间后,它可以按回车键.这有点复杂,因为您必须弄清楚如何从第二个 applescript 中定位您的对话框,但这不会太难.最好为您的对话框指定一个标题,然后使用系统事件找到具有该标题的窗口.

Something that might be within your abilities... you could simulate your own "on done editing" method. You could have a second applescript launch when your first applescript which shows the dialog box is run. This second applescript could check the text field of the dialog box periodically. When the text stops changing for a certain length of time then it could press the return key. It's a little complicated because you have to figure out how to target your dialog box from the second applescript, but it wouldn't be too hard. It might be best to give your dialog box a title, and then use system events to find the window with that title.

您必须在单独的 applescript 中执行此操作的原因是因为您的普通 applescript 在对话框打开时会暂停所有命令.因此,您需要运行一个单独的进程来检查文本字段,而第二个脚本将是最简单的方法.

The reason you have to do this in a separate applescript is because your normal applescript pauses all commands while the dialog box is open. So you need a separate process running to check the text field and a second script would be the easiest way.

EDIT:以下是如何使用applescript 进行操作. 首先创建这个脚本,这是您完成的编辑脚本.当用户停止输入文本时,它将关闭您的对话框.将其另存为一个名为 onDoneEditing 的脚本到您的桌面.

EDIT: Here's how to do it with applescript. First create this script which is your on done editing script. It will dismiss your dialog when the user stops entering text. Save it as a script called onDoneEditing to your desktop.

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"启动上述脚本,以便它在后台进程中运行.然后它会为您显示对话框.您可以阅读我在两个脚本中的评论以了解每个脚本的工作原理.

Now create this script. This script will launch the above script using the command line tool "osascript" so that it runs in a background process. Then it shows the dialog box for you. You can read my comments in both scripts to understand how each works.

-- 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

这篇关于Applescript在输入后自动关闭对话框?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆