2012-04-28 19 views
10

¿Ustedes saben cómo activar la n-ésima ventana de Google Chrome con Applescript? Por ejemplo, si tengo tres ventanas de Google Chrome abiertas, ¿cómo activo el segundo?Applescript - Google Chrome activar una ventana determinada

He probado muchas combinaciones diferentes, por ejemplo: pestaña tell 3 de ventana 2 para activar

También he notado que:

aplicación Tell "Google Chrome" ventana 1 diga para activar final dirá

y,

aplicación Tell "Google Chrome" decirle ventana 2 para activar end tell

producen los mismos resultados, solo activa la última ventana abierta, ¿Esto es un error?

Gracias de antemano :)

Respuesta

8

tl; dr

Usando set index of window <n> to 1 no es totalmente eficaz en la que no se active realmente la ventana - lo hace visible, sin embargo.

Soluciones provisionales (Ejemplos Supongamos que desea activar la ventana 2):

  • Yar's answer ofrece una solución pragmática, aunque no está del todo claro por qué funciona. Sin embargo, tiene la ventaja de no que requiere que la aplicación de llamada sea authorized for assistive access, a diferencia de las siguientes soluciones.

  • user495470's answer alude a una solución robusta y genérico que también trabaja con aplicaciones no AppleScriptable:

    tell application "System Events" to tell process "Google Chrome" 
        perform action "AXRaise" of window 2 
        set frontmost to true 
    end tell 
    
  • Alternativamente, utilizar el controlador AppleScript se define a continuación como sigue:

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

Mientras adayzdone's answerdebe trabajo y casi hace, hay una trampa - que puede o no puede ser un problema (como se observa en Chrome 21.0.1180.89 en Mountain Lion) [actualización sigue siendo válida a partir del cromo 47.0.2526.106 en OSX 10.11.2]:

Mientras que la solución se mostrar la ventana deseada como la ventana delantera, Chrome no tratar como la ventana delantera si una ventana diferente era previamente activo. Puede decir mediante los botones de barra de título de cierre/min/zoom inactivos, por qué título de ventana está la marca de verificación, y por el hecho de que los atajos de teclado como Cmd-L no se aplicarán a la ventana deseada.

Si su próxima acción será haga clic en en algún lugar de la ventana de todos modos, esto puede no ser un problema, ya que un clic activará completamente la ventana deseada.

De lo contrario, se puede emplear un razonablemente robusta solución GUI-scripting (agradecimiento adaptado de una solución genérica here):

actualización: Lamentablemente, el problema de la realidad no activar la ventana cuyo índice se establece a 1 parece afectar TODAS las aplicaciones (experimentadas en OS X 10.8.3). Aquí hay una función genérica que activa correctamente una ventana dada en una aplicación determinada de AppleScriptable mediante el uso de scripts 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 

En una nota lateral, lo que el PO intentó - por ejemplo, activate window 1 - parece no estar funcionando en todas las aplicaciones en OS X 10.8.3, así - mientras que la aplicación subyacente se activa, la especificación de la ventana. es ignorado

Aquí está el original, más código didáctica:

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 
7

Probar:

tell application "Google Chrome" 
    activate 
    set index of window 1 to 1 
    delay 3 
    set index of window 2 to 1 
end tell 
+0

wow ... esto funciona a la perfección. Pensé que era simplemente imposible :) – m41n1

2

Como se mencionó mklement, cambiando el índice plantea la ventana, pero por ejemplo atajos de teclado todavía están registrados por la ventana situada en primer plano con anterioridad.

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

Otra opción es decirle a eventos del sistema a la ventana 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 
+0

Bien hecho - 'AXRaise' es realmente una solución efectiva; sin embargo, puede y debe usarlo _por sí mismo_: 'indicar a la aplicación" Eventos del sistema "para indicar el proceso" Google Chrome "¬ \t realizar la acción" AXRaise "de la ventana 2 \t establecer de frente a verdadero end tell¬' is suficiente. – mklement0

1

Establecer el índice y luego abrir Chrome.

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

Source

+0

+1; Curiosamente, este _does_ funciona, a diferencia del uso del equivalente 'activate it' (o de intentar establecer la propiedad' frontmost' del objeto de proceso en 'true'), ¿puedes explicar por qué? – mklement0

+1

@ mklement0 No puedo explicarlo de manera satisfactoria. Puede ver que sin el script de shell, el foco de la ventana cambia, pero no el primer foco de respuesta (el cursor de texto, básicamente) ... ejecutar Chrome lo fuerza a dar prioridad a su ventana principal. Así que eso es solo explicar lo que está sucediendo, pero no cómo, pero espero que ayude. –

-1

Si ejecuta este

activate application "Google Chrome" 
tell application "System Events" to keystroke "`" using command down 

que va a hacer todo el asunto, aunque su carrera de editor de guión.

heres de otra forma, éste ya fue detallado por otra persona simplemente en varias etapas:

tell application "System Events" to tell process "Google Chrome" to perform action "AXRaise" of window 2 
activate application "Google Chrome" 

si usted está dispuesto a guardarlo como una aplicación y asignarlo a una tecla de acceso directo, usted puede hacer esto:

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

Aunque supongo que en ese momento también puede simplemente presionar el comando + `.A menos que, por supuesto, su applescript implica una serie de pasos que crean una serie de pasos, como es probable que sea el caso. Si se trata de una serie de pasos, algo como la primera línea del segundo ejemplo de código sería todo lo que necesitaría, siempre que lo asigne a una tecla de acceso rápido y presione la tecla de acceso rápido cuando Chrome ya esté activado (o la línea aparezca después de que Chrome esté activado en tu código).

+0

Como indiqué en mi respuesta, aunque esto mostrará _la_ ventana especificada, no la convertirá en la _actividad_ (en términos de entrada/enfoque del teclado). – mklement0

+0

no, no es una repetición, aunque alguien más mencionó "establecer índice de ventana 2 a 1", su explicación fue de 3 líneas, la mía era 1. si quieres enfocar parece que debe ser una línea adicional, pero aún solo 2 líneas es importante y no redundante porque si no supieras que podrías reducirlo a una línea, es posible que sientas que el lenguaje es demasiado extraño como para que valga la pena intentarlo. también edité mi cosa original ahora que se enfoca. – pau

+0

Si realmente crees que convertir 3 líneas de una _respuesta existente en 1 agrega valor, deberías decir eso en tu respuesta. Dicho esto, su intento de solución con la línea adicional añadida más tarde no funciona: la declaración 'activate application' reactiva la ventana previamente activa. – mklement0

1

Además de las soluciones con respecto a la activación de la ventana deseada, (al menos) las nuevas versiones de Chrome también apoyan active tab index propiedad ventanas:

tell window 1 
    set active tab index to 5 
end tell 
Cuestiones relacionadas