applescript:如何在多个窗口中执行击键

Posted

技术标签:

【中文标题】applescript:如何在多个窗口中执行击键【英文标题】:applescript: how to execute keystroke in several windows 【发布时间】:2021-08-18 13:48:21 【问题描述】:

我需要在某些应用程序(例如,safari 浏览器)中通过 applescript 执行一些击键(例如,cmd + t 以创建新选项卡)。所以,我写了一段代码:

tell application "Safari" to activate
tell application "Safari"
    set wList to every window whose visible is true

    repeat with app_window in wList
        log app_window
        set index of app_window to 1
        tell application "System Events"
            keystroke "t" using command down
        end tell
        delay (1)
    end repeat
end tell

我希望这段代码能够在每个打开的 Safari 窗口中打开一个新选项卡。但实际上,这段代码只是在第一个活动的 safari 窗口中打开 n 新选项卡,其中 n - 是打开的 safari 窗口的计数。看来我在这一行中更改焦点时遇到了问题:

set index of app_window to 1

那么,如何正确更改焦点以在每个窗口中执行击键?

UPD

有趣的事情 - 此代码在 Finder 应用程序中正常工作(只需替换 Safari -> Finder),但它不适用于 safari 和 ios 模拟器 (Xcode)

UPD

此外,它不适用于 Google Chrome - 我遇到了同样的行为。

【问题讨论】:

不使用Safari make new tab 命令的原因是什么? Safari 中的新标签 - 是一个简化的示例 :) 在实际情况下,我需要在 ios 模拟器中做更复杂的事情。这段代码应该在不同版本的模拟器中工作,我需要切换的选项可以位于模拟器菜单的不同部分。在某些版本中是I/O -> Keyboard -> Toggle keyboard,在另一个版本中是Hardware -> Keyboard -> Toggle keyboard。但是两个版本都有相同的热键 - Cmd + K,所以我试图调用这个热键。 您可以使用try-statement 和on error 语句。你说菜单有两种不同的方式,所以如果你try 一种失败了,它只会尝试另一种。如果您发现有更多的方式可以构建菜单,您也可以嵌套这样的语句。 【参考方案1】:

您不能直接控制窗口的索引,因为属性 indexread/only。但是你可以在 Safari.app 的帮助下做到这一点:

tell application "Safari"
    activate
    set wList to every window whose visible is true
    repeat with aWindow in wList
        tell application "System Events" to keystroke "t" using command down
        set miniaturized of aWindow to true
        delay 1
    end repeat
    repeat with aWindow in wList
        set miniaturized of aWindow to false
    end repeat
end tell

注意:您可以使用 visible 属性代替 miniaturized 属性(无需延迟):

tell application "Safari"
    activate
    set wList to every window whose visible is true
    repeat with aWindow in wList
        tell application "System Events" to keystroke "t" using command down
        set visible of aWindow to false
    end repeat
    repeat with aWindow in wList
        set visible of aWindow to true
    end repeat
end tell

【讨论】:

谢谢!您的最小化版本正在运行!【参考方案2】:

如果您想在 Safari 中的所有窗口 中添加一个新的tab,那么可以这样做:

示例 AppleScript 代码

tell application "Safari"
    set myWindows to a reference to windows
    repeat with thisWindow in myWindows
        make new tab at end of tabs of thisWindow
    end repeat
end tell 

注意事项:

您可以将at end of tabs 更改为其他位置,即:

[at 位置说明符]:插入对象的位置。

例如:at beginning of tabs


更新地址评论:

示例 AppleScript 代码

tell application "Safari"
    activate
    set myWindows to ¬
        (windows whose visible is true)
    repeat with thisWindow in myWindows
        set winName to name of thisWindow
        my addNewTab(winName)
        --  # Do other stuff here.
        
    end repeat
end tell

to addNewTab(winName)
    tell application "System Events"
        perform action "AXRaise" of ¬
            window winName of process "Safari"
        delay 0.5
        keystroke "t" using command down
    end tell
end addNewTab
  

注意:示例 AppleScript 代码就是这样,没有任何包含的错误处理 em> 不包含任何适当的附加错误处理。用户有责任根据需要或需要添加任何错误处理。查看AppleScript Language Guide 中的try statementerror statement。另请参阅Working with Errors。此外,在适当的情况下,可能需要在事件之间使用delay 命令,例如delay 0.5延迟设置得当。

【讨论】:

酷,谢谢。但我对按键调用很感兴趣。我的 ios 模拟器有问题(safari 的例子是合成的) - 我需要在模拟器中切换键盘,我可以用 cmd + K 击键来完成。也许您知道如何在窗口之间切换并在每个窗口中执行击键? Rostislav Shtanko,请参阅我的回答的更新地址评论:部分。 hm,您的新示例看起来像我的问题中的示例。我尝试执行它并得到相同的行为(n 一个 Safari 窗口中的新标签)。您是否在您的 Mac 上启动了此代码? @Rostislav Shtanko,请再次查看更新以解决评论: 部分,因为我已经用之前的代码 解决了这个问题。 不幸的是,它仍然在一个窗口中创建n 选项卡。但是具有最小化功能的 Robert Kniazidis 版本正在运行。

以上是关于applescript:如何在多个窗口中执行击键的主要内容,如果未能解决你的问题,请参考以下文章

使用 AppleScript 在当前 Finder 窗口中打开 iCloud

如何在powershell中执行击键?

AppleScript常用案例

将击键发送到特定窗口(在后台),但同时做其他事情[重复]

如何编写 Applescript 来调整外接显示器上的应用程序窗口大小

一旦程序完成并在 1 次击键后关闭,是不是有办法让控制台窗口保持打开状态?