简短版
我想编写一些 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
这会启动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
我想要:
- 给定一个应用程序名称...
- 获取该应用程序的所有窗口,并循环遍历每个窗口,对于每个窗口:
- 激活/将该窗口置于前台(如果没有最小化)并...
- 告诉BetterTouchTool运行给定名称的触发器。
......但我不知道如何执行bring_window_to_front()
部分!
(此外,这里没有考虑其他桌面; 但我认为我可以没有它。)
概述
我希望:
- 给定一个应用程序名称...
- 获取该应用程序的所有窗口,并循环遍历每个窗口,对于每个窗口:
- 激活/将该窗口置于前台(如果没有最小化)并...
- 告诉BetterTouchTool运行给定名称的触发器。
上下文
- MacOS Mojave 10.14.5
- BetterTouchTouch 3.072 (我认为这没有任何影响)