AppleScript:循环访问应用程序窗口;将每个置于前面并在其他应用程序中触发操作?



简短版本

我想编写一些在应用程序(未最小化的(窗口上迭代的苹果本,对于每个应用程序,将其带到前面,并在另一个应用程序中触发某些内容BTT(将移动窗口(。目的是将应用程序的所有窗口移至同一位置。(由BTT(处理了移动零件,我只需要帮助将其实现到All App的Windows。

长版本

(这个问题涉及更好的Touchtool,但这并不是真正的 - 我认为 - 我怀疑您不需要对BTT的了解来回答...(

我正在尝试编写一个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

激活VSCODE,然后告诉BTT运行命名触发器,将当前窗口移至屏幕上的某个位置。效果是最近使用的VSCODE窗口移动了。

好吧,不是一个糟糕的开始,但是我想为 all vscode Windows(或理想情况下,当前可见的台式机上的所有非最小化的Windows(。

BTT的AppleScript界面似乎不支持针对特定窗口的目标 - 它只是在任何应用程序中都可以使用,因此我需要以某种方式激活/将窗口(?(the window 然后调用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

...我不知道该怎么做bring_window_to_front()部分!

(在这里也没有考虑:其他桌面;但是我认为没有那个。(

有人可以将我指向正确的方向吗?所有人都感谢!

摘要

我想:

  • 给定的申请给定名称...
  • 将其所有窗户和循环绕过它们,每个窗户都可以:
  • 激活/将该窗口带到前面(提供最小化(和...
  • 告诉BetterTouchTool用给定名称运行扳机。

上下文

  • MacOS Mojave 10.14.5
  • BetterTouchTouch 3.072(我认为这有任何不同(

任何脚本可脚本的应用 - 我假设" Visual Studio Code"是可以拼写的(具有脚本字典(,应该响应此代码:

on run
    if application "Visual Studio Code" is running then
        tell application "Visual Studio Code" to activate
        set wList to every window whose visible is true
        repeat with app_window in wList
            set index of app_window to 1
            delay .5
            tell application "BetterTouchTool"
                trigger_named "Move window: monitor 4k: core"
            end tell
        end repeat
    end if
end run
  • 第4行的... whose visible is true一部分排除了隐藏或最小化的窗口。
  • 在第6行中的set index of ...命令每个窗口到正面的每个窗口。

indexvisible是所有AppleScript开发人员都应实现的标准窗口属性的一部分,因此,除非应用程序设计师是完整的业余爱好者,否则他们应该"工作"。请确保查看脚本编辑中的脚本字典。有时,AppleScript设计师添加有用的特殊命令,或更改标准属性的名称(可能只是为了烦人(。

我不确定是否需要第7行中的delay .5。我把它扔进去,以使窗户在btt呼叫之前是最前端的。

除非应用程序不可用,否则请勿使用GUI摩擦或系统事件。当GUI扫描是需要所需的时非常有用的,但是如果该应用具有脚本词典,则使用该词典,这将更加有效和可靠。吉式摩擦是笨拙,缓慢的,并且受到不可预测的破坏。但是,如果您确实需要使用它,则代码相似。

tell application "System Events"
    tell process "Visual Studio Code"
        set frontmost to true
        set wlist to every window
        repeat with aWindow in wlist
            tell aWindow
                perform action "AXRaise"
                delay .5
                tell application "BetterTouchTool"
                    trigger_named "Move window: monitor 4k: core"
                end tell
            end tell
        end repeat
    end tell
end tell

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

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

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

最新更新