AppleScript:循环应用程序窗口;将每个都放在前面并触发其他应用程序中的操作?

gim*_*and 5 macos applescript

简洁版本

我想编写一些AppleScript,它会迭代应用程序的(非最小化)窗口,并为每个应用程序将其带到前面并触发另一个应用程序BTT(将移动窗口)中的某些内容。目的是将应用程序的所有窗口移动到同一位置。移动部分已处理(由 BTT),我只需要帮助使这种情况发生在应用程序的所有窗口上。

长版

(这个问题涉及BetterTouchTool,但它并不是真正的问题 - 我认为 - 我怀疑你不需要了解任何有关 BTT 的知识来回答......)

我正在尝试编写一个 AppleScript 脚本(当我将其简化为最简单的版本时)激活一些应用程序,并循环遍历其所有窗口,为每个窗口触发 BetterTouchTool“命名触发器”。指定触发器的工作是将当前窗口移动到某个位置,但其细节并不重要。

我觉得这应该很简单,但我似乎无法找到正确的方法。我已经尝试过对它进行货物崇拜,但我没有取得任何进展(除了怀疑我需要涉及“系统事件”)......我是一名经验丰富的程序员,但我从未深入研究过 AppleScript 和发现它做事的方式相当奇怪/令人困惑。

到目前为止,我正在工作的是一个不会在窗口上循环的版本,因此它只会点击“第一个”(在某种意义上的“第一个”,这似乎是“该应用程序最近活跃的”) )。

例如,以下作品。(我已将其硬编码到 VSCode,尽管在我尝试编写的完整内容中,它会迭代应用程序名称列表以及为它们运行的​​触发器。)

on run
    if application "Visual Studio Code" is running then
        tell application "Visual Studio Code" to activate
        tell application "BetterTouchTool"
            trigger_named "Move window: monitor 4k: core"
        end tell
    end if
end run
Run Code Online (Sandbox Code Playgroud)

这样就会激活 VSCode,然后告诉 BTT 运行命名触发器以将当前窗口移动到屏幕上的某个位置。效果是最近使用的 VSCode 窗口被移动。

好的,这是一个不错的开始,但我想对所有VSCode 窗口(或者理想情况下,当前可见桌面上的所有非最小化窗口)执行此操作。

BTT 的 AppleScript 界面似乎不支持针对特定窗口 - 它只适用于任何活动的应用程序/窗口,因此我需要以某种方式激活/将窗口置于前面(?),然后调用 BTT 触发器。

我想我需要这样的东西(暂时忽略忽略最小化窗口的问题):

on run
    if application "Visual Studio Code" is running then
        tell application "Visual Studio Code" to activate
        repeat with app_window in windows
            bring_window_to_front()
            tell application "BetterTouchTool"
                trigger_named "Move window: monitor 4k: core"
            end tell
        end repeat
    end if
end run
Run Code Online (Sandbox Code Playgroud)

...我不知道如何做这个bring_window_to_front()部分!

(这里也没有考虑:其他桌面;但我认为没有它我也可以生活。)

有人能指出我正确的方向吗?感谢所有帮助!

概括

我想要:

  • 给定一个由给定名称标识的应用程序...
  • 获取其所有窗口并循环遍历它们,对于每个窗口:
  • 激活/将该窗口带到前面(前提是它没有最小化)并且...
  • 告诉 BetterTouchTool 使用给定名称运行触发器。

语境

  • MacOS 莫哈维 10.14.5
  • BetterTouchTouch 3.072(我认为这没有什么区别)

pbe*_*ell 1

是的,您需要系统事件。它可以为您提供所有正在运行和可见的进程(即=应用程序)以及每个窗口的列表。

更重要的是,您可以直接更新每个窗口的位置。这是示例脚本,它获取所有应用程序的所有打开的窗口并移动“脚本编辑器”的“库”窗口的位置(我打开它进行测试):

tell application "System Events"
set theProcesses to application processes whose visible is true
repeat with aProcess in theProcesses -- loop thru all visible processes

    set allWindows to every window of aProcess
    repeat with myWindow in allWindows -- for each process, look for all windows

        set Pname to name of aProcess
        set Wname to name of myWindow
        if Pname = "Script Editor" and Wname = "Library" then
            set position of myWindow to {400, 900}
        end if

    end repeat -- window loop
end repeat -- process loop
end tell
Run Code Online (Sandbox Code Playgroud)