13

你们知道如何使用 Applescript 激活第 n 个 Google Chrome 窗口吗?例如,如果我打开了三个谷歌浏览器窗口,如何激活第二个?

我尝试了许多不同的组合,例如:告诉窗口 2 的选项卡 3 激活

我还注意到:

告诉应用程序“谷歌浏览器”告诉窗口 1 激活结束告诉

和,

告诉应用程序“谷歌浏览器”告诉窗口 2 激活结束告诉

产生相同的结果,它只激活最后打开的窗口,这是一个错误吗?

提前致谢 :)

4

6 回答 6

16

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
于 2012-09-08T05:25:58.343 回答
8

尝试:

tell application "Google Chrome"
    activate
    set index of window 1 to 1
    delay 3
    set index of window 2 to 1
end tell
于 2012-04-28T19:27:52.470 回答
4

正如 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
于 2013-05-24T03:13:10.127 回答
2

设置索引,然后打开 Chrome。

tell application "Google Chrome"
    set index of window 2 to 1
    delay 0.01
    do shell script "open -a Google\\ Chrome"
end tell

来源

于 2015-12-19T21:57:28.660 回答
2

除了有关激活所需窗口的解决方案外,(至少)较新的 Chrome 版本还支持 windows 的active tab index属性:

tell window 1
    set active tab index to 5
end tell
于 2016-01-14T16:28:17.367 回答
0

如果你运行这个

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 之后在您的代码中激活)。

于 2015-12-21T04:19:11.300 回答