这是一个小脚本,它在激活时会在文档中输入文本。

tell application "TextEdit"
  activate
end tell
delay 0.2
tell application "System Events"
  keystroke "Hello World!"
  keystroke return
end tell


我将delay固定在其中,因为否则,前几次击键会在窗口完成之前触发激活,所以我最终看到“ lo World!”激活脚本后,文档中的“ Hel”和其他任何窗口中的“ Hel”都会聚焦。是对delay的正确使用,还是有更好的方法来解决该问题?

评论

您好,欢迎Abby和所有参加Code Review的人。正如所有人的决定一样,将定期监视和清除这些评论。玩得很开心。

您可能会发现此博客有用。

Wiki Books的代码示例与此处相似:en.wikibooks.org/wiki/AppleScript_Programming/System_Events由于Applescript中缺少自定义事件,因此这似乎已被接受(stackoverflow.com/questions/3127153/…) 。

您打算插入“ Hello World!”光标恰好在哪里?

尽管Apple经常在Code Review上进行Apple的所有其他事情的巡逻,并且与普遍的看法相反,AppleScript不在我的专业领域。尽管如此,我相信这是我们的第一个AppleScript问题?我想知道为什么我们没有AppleScript FizzBu​​zz。看看CodeReview ...

#1 楼

与其使用系统事件来生成击键,不如考虑使用TextEdit本身来插入文本。

tell application "TextEdit"
    activate
    tell first document to set its text to its text & "Hello World!\n"
end tell


有所不同:该版本始终附加“ Hello World!”。到文档末尾,而不是光标所在的位置。 (不幸的是,TextEdit的AppleScript词典没有提及任何有关游标的信息。)

这种方法的一个附带好处是,您不必授予对脚本使用“辅助访问”的权限。

#2 楼

假设您希望按照原始计划在光标所在的位置插入文本,那么您将需要确定性而不是任意延迟。

该脚本涵盖了我能想到的所有情况:

 tell application "System Events"        
    -- In case TextEdit was already running and all windows were closed
    repeat until first window of application "TextEdit" exists
        tell application "TextEdit" to make new document at the front
        delay 0.001
    end repeat

    -- Ensure TextEdit can have focus
    repeat until process "TextEdit" is frontmost
        set frontmost of process "TextEdit" to true
        delay 0.001
    end repeat

    -- Give focus to the window
    set focused of first window of process "TextEdit" to true

    keystroke "Hello world\n"
end tell
 


特别地,我测试的场景包括:


TextEdit根本没有运行
TextEdit正在运行,但是根本没有文档窗口
TextEdit已经运行了一个或多个窗口

您自己会知道该技术是行之有效的,请在注释掉循环主体的情况下尝试每种情况,并且您应该看到脚本将等到条件合适后再继续。

但不能保证。 ,即用户在发送击键时不会刻意尝试引发竞赛情况。