你们知道如何使用 Applescript 激活第 n 个 Google Chrome 窗口吗?例如,如果我打开了三个谷歌浏览器窗口,如何激活第二个?
我尝试了许多不同的组合,例如:告诉窗口 2 的选项卡 3 激活
我还注意到:
告诉应用程序“谷歌浏览器”告诉窗口 1 激活结束告诉
和,
告诉应用程序“谷歌浏览器”告诉窗口 2 激活结束告诉
产生相同的结果,它只激活最后打开的窗口,这是一个错误吗?
提前致谢 :)
你们知道如何使用 Applescript 激活第 n 个 Google Chrome 窗口吗?例如,如果我打开了三个谷歌浏览器窗口,如何激活第二个?
我尝试了许多不同的组合,例如:告诉窗口 2 的选项卡 3 激活
我还注意到:
告诉应用程序“谷歌浏览器”告诉窗口 1 激活结束告诉
和,
告诉应用程序“谷歌浏览器”告诉窗口 2 激活结束告诉
产生相同的结果,它只激活最后打开的窗口,这是一个错误吗?
提前致谢 :)
tl;博士
使用set index of window <n> to 1
并不完全有效,因为它并没有真正激活窗口 - 但它确实使它可见。
解决方法(示例假设您要激活窗口 2):
Yar 的回答提供了一种实用的解决方法,尽管尚不完全清楚它为什么起作用。但是,与以下解决方案不同,它确实具有不需要授权调用应用程序进行辅助访问的优点。
user495470 的回答暗示了一个强大且通用的解决方案,该解决方案也适用于非 AppleScriptable 应用程序:
tell application "System Events" to tell process "Google Chrome"
perform action "AXRaise" of window 2
set frontmost to true
end tell
或者,使用下面定义的 AppleScript 处理程序,如下所示:
tell application "Google Chrome" to my activateWin(it, window 2)
虽然adayzdone 的答案 应该有效并且几乎有效,但有一个问题 - 这可能是也可能不是问题(在 Mountain Lion 上的 Chrome 21.0.1180.89 上观察到)[更新:自 OSX 10.11.2 上的 Chrome 47.0.2526.106 起仍然适用] :
虽然该解决方案会将所需窗口显示为前窗口,但如果其他窗口之前处于活动状态,Chrome 不会将其视为前窗口。您可以通过不活动的关闭/最小/缩放标题栏按钮、复选标记旁边的窗口标题以及键盘快捷键(例如Cmd-L
不会应用于所需窗口)这一事实来判断。
如果您的下一步操作是单击窗口上的某个位置,这可能不是问题,因为这样的单击将完全激活所需的窗口。
否则,您可以采用相当强大的 GUI 脚本解决方法(非常感谢这里的通用解决方案):
更新:可悲的是,实际上没有激活索引设置为 1 的窗口的问题似乎会影响所有应用程序(在 OS X 10.8.3 上遇到过)。这是一个通用函数,它使用 GUI 脚本正确激活给定 AppleScriptable 应用程序中的给定窗口。
# Activates the specified window (w) of the specified AppleScriptable
# application (a).
# Note that both parameters must be *objects*.
# Example: Activate the window that is currently the 2nd window in Chrome:
# tell application "Google Chrome"
# my activateWin(it, window 2)
# end tell
on activateWin(a, w)
tell application "System Events"
click menu item (name of w) of menu 1 of menu bar item -2 ¬
of menu bar 1 of process (name of a)
end tell
activate a
end activateWin
附带说明一下,OP 所尝试的 - 例如activate window 1
- 似乎在 OS X 10.8.3 上的所有应用程序中也被破坏了 - 当底层应用程序被激活时,窗口规范。被忽略。
这是原始的,更具教学性的代码:
tell application "Google Chrome"
# Each window is represented by the title of its active tab
# in the "Window" menu.
# We use GUI scripting to select the matching "Window" menu item
# and thereby properly activate the window of interest.
# NOTE: Should there be another window with the exact same title,
# the wrong window could be activated.
set winOfInterest to window 2 # example
set winTitle to name of winOfInterest
tell application "System Events"
# Note that we must target the *process* here.
tell process "Google Chrome"
# The app's menu bar.
tell menu bar 1
# To avoid localization issues,
# we target the "Window" menu by position - the next-to-last
# rather than by name.
click menu item winTitle of menu 1 of menu bar item -2
end tell
end tell
end tell
# Finally, activate the app.
activate
end tell
尝试:
tell application "Google Chrome"
activate
set index of window 1 to 1
delay 3
set index of window 2 to 1
end tell
正如 mklement 所提到的,更改索引会提升窗口,但例如键盘快捷键仍由先前最前面的窗口注册。
tell application "Google Chrome"
set index of window 2 to 1
end tell
另一种选择是将系统事件告诉 AXRaise 窗口 1:
tell application "Google Chrome"
set index of window 2 to 1
end tell
tell application "System Events" to tell process "Google Chrome"
perform action "AXRaise" of window 1
end tell
设置索引,然后打开 Chrome。
tell application "Google Chrome"
set index of window 2 to 1
delay 0.01
do shell script "open -a Google\\ Chrome"
end tell
除了有关激活所需窗口的解决方案外,(至少)较新的 Chrome 版本还支持 windows 的active tab index
属性:
tell window 1
set active tab index to 5
end tell
如果你运行这个
activate application "Google Chrome"
tell application "System Events" to keystroke "`" using command down
即使它是从脚本编辑器运行的,它也会完成整个事情。
这是另一种方式,这个已经由其他人在更多步骤中拼写出来:
tell application "System Events" to tell process "Google Chrome" to perform action "AXRaise" of window 2
activate application "Google Chrome"
如果您愿意将其保存为应用程序并将其分配给热键,您可以这样做:
tell application "Google Chrome" to set index of window 2 to 1
虽然我想那时你也可以简单地点击命令+`。当然,除非您的 applescript 涉及创建一系列步骤的一系列步骤,这很可能是这种情况。如果它涉及一系列步骤,那么您只需要第二个代码示例的第一行,只要您将它分配给一个热键并在 chrome 已经激活时点击热键(或者该行出现在 chrome 之后在您的代码中激活)。