Вопрос по – Applescript - Google Chrome активирует определенное окно

12

Ребята, вы знаете, как активировать n-е окно Google Chrome с помощью Applescript? Например, если у меня открыто три окна Google Chrome, как активировать второе?

Я пробовал много разных комбинаций, например: сказать вкладку 3 окна 2 для активации

Я также заметил, что:

сообщить приложению "Google Chrome"     скажи окну 1 активировать конец сказать

а также,

сообщить приложению "Google Chrome"     сказать окну 2 для активации конец сказать

выдает те же результаты, активирует только последнее окно открыл, это ошибка?

Заранее спасибо :)

Ваш Ответ

6   ответов
13

tl;dr

С помощьюset index of window <n> to 1 не является полностью эффективным в том смысле, что это не совсемactivate окно - оно делает этоvisible, хоть.

Workarounds (примеры предполагают, что вы хотите активировать окно 2):

  • Yar's answer offers a pragmatic workaround, though it's not entirely clear why it works. It does, however, have the advantage of not requiring the calling application to be authorized for assistive access, unlike the following solutions.

  • user495470's answer hints at a robust and generic solution that also works with non-AppleScriptable applications:

    tell application "System Events" to tell process "Google Chrome"
        perform action "AXRaise" of window 2
        set frontmost to true
    end tell
    
  • Alternatively, use the AppleScript handler defined below as follows:

    • tell application "Google Chrome" to my activateWin(it, window 2)

В то время какответ адайздона should работа иalmost есть, есть улов - который может или не может быть проблемой (наблюдается на Chrome 21.0.1180.89 на Mountain Lion) [update: still applies as of Chrome 47.0.2526.106 on OSX 10.11.2]:

Пока решение будетshow желаемое окно, как переднее окно, Chrome НЕ будетtreat это как переднее окно, если ранее было активно другое окно. Вы можете узнать по неактивным кнопкам строки заголовка закрыть / мин / увеличить, по какому заголовку окна стоит галочка, а также по тому, что такие сочетания клавиш, какCmd-L не будет применяться к нужному окну.

Если ваше следующее действие будетclick в любом случае, где-нибудь в окне, это может не быть проблемой, так как такой щелчок полностью активирует желаемое окно.

В противном случае вы можете использовать достаточно надежный обходной путь GUI-сценариев (с благодарностью адаптированный из общего решения).Вот):

UpdateК сожалению, проблема не на самом делеactivating окно, индекс которого вы установили на 1, похоже, влияет на ВСЕ приложения (в OS X 10.8.3). Вот этоgeneric function that properly activates a given window in a given AppleScriptable app используя сценарии GUI.

# 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

С другой стороны, то, что пытался ФП - например,activate window 1 - кажется, сломан во всех приложениях на OS X 10.8.3 - в то время как основнойapplication активировано, окно спец. игнорируется

Вот оригинал, большеdidactic code:

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
2

касающимся активации нужного окна, (по крайней мере) более новые версии Chrome также поддерживают Windows & # x2019;active tab index имущество:

tell window 1
    set active tab index to 5
end tell
Error: User Rate Limit Exceededexisting answerError: User Rate Limit Exceededstate thatError: User Rate Limit Exceededactivate applicationError: User Rate Limit Exceeded
Error: User Rate Limit ExceededwillError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededshowError: User Rate Limit ExceededactiveError: User Rate Limit Exceeded
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

Источник

Error: User Rate Limit ExceededdoesError: User Rate Limit Exceededactivate itError: User Rate Limit ExceededfrontmostError: User Rate Limit ExceededtrueError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
8

Пытаться:

tell application "Google Chrome"
    activate
    set index of window 1 to 1
    delay 3
    set index of window 2 to 1
end tell
Error: User Rate Limit Exceeded m41n1
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

хотя я полагаю, что в этот момент вы можете просто нажать команду + `. Если, конечно, ваш яблочный скрипт включает в себя ряд шагов, создающих серию шагов, как это, вероятно, имеет место. Если он включает в себя последовательность шагов, то вам понадобится что-то вроде первой строки второго примера кода, при условии, что вы назначаете его горячей клавише и нажимаете горячую клавишу, когда Chrome уже активирован (или строка появляется после того, как Chrome активирован в вашем коде).

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededwillError: User Rate Limit Exceeded
Error: User Rate Limit ExceededshowError: User Rate Limit ExceededactiveError: User Rate Limit Exceeded
Error: User Rate Limit Exceededexisting answerError: User Rate Limit Exceededstate thatError: User Rate Limit Exceededactivate applicationError: User Rate Limit Exceeded
3

изменение индекса поднимает окно, но, например, сочетания клавиш по-прежнему регистрируются в самом переднем окне.

tell application "Google Chrome"
    set index of window 2 to 1
end tell

Другой вариант - сообщить Системные события в окно 1 AXRaise:

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
Error: User Rate Limit ExceededAXRaiseError: User Rate Limit Exceededby itself: tell application "System Events" to tell process "Google Chrome"¬ perform action "AXRaise" of window 2¬ set frontmost to true¬ end tell¬Error: User Rate Limit Exceeded

Похожие вопросы