12 votos

script para subir una sola ventana al frente

En un script estoy tratando de encontrar la ventana de Terminal.app que contiene un dispositivo tty específico y elevar esa ventana a la parte superior. Esto es lo que tengo en Applescript hasta ahora:

tell application "System Events"
  set foundWin to false
  if (name of processes) contains "Terminal" then
    tell application "Terminal"
      set theTabs to first tab of every window where tty is "$(tty)"
      repeat with theTab in theTabs
        if class of theTab is tab then
          set theWin to (first window whose tabs contains theTab)
          set selected tab of theWin to theTab
          set foundWin to true
        end if
      end repeat
    end tell
  end if
  if foundWin then
    --RAISE THE WINDOW?!
  end if
end tell

Donde me estoy atascando es en la parte de "levantar la ventana".

Aquí hay algunas cosas que no son del todo lo que quiero:

set frontmost of theWin to true -- esto lleva la ventana al frente del grupo de ventanas de Terminal.app pero no la eleva por encima de ninguna otra ventana.

tell application "Terminal" to activate -- esto trae todas las ventanas de la Terminal al frente en una gran pila. Sólo quiero una ventana.

tell application "System Events"
    set theSysWin to first window of process "Terminal" whose name is (name of theWin)
    perform action "AXRaise" of theSysWin
end tell

Esto casi lo logra, pero lo que hace es elevar la ventana de la terminal a la posición #2, aún debajo de la ventana activa (si la aplicación activa es otra que Terminal.app.)

click theSysWin at {10,50} -- no parece hacer nada.

click first static text of theSysWin -- no parece hacer nada.

¿Hay alguna forma de hacerlo? No tiene que ser en Applescript.

EDITAR He encontrado esta página web ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) citando una llamada Obj-C/Cocoa:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

No estoy familiarizado ni con ObjC ni con Cocoa, y esto (en última instancia) está siendo invocado desde un shell script, así que no estoy seguro de a dónde ir desde allí.

7voto

open sólo levanta una ventana:

do shell script "open -a Terminal"

Otra forma de subir una ventana es poner su índice a 1 y luego usar AXRaise:

tell application "Terminal"
    set index of window 2 to 1
end tell
tell application "System Events" to tell process "Terminal"
    perform action "AXRaise" of window 1
end tell

0 votos

Es decir, haciendo clic en en la ventana tiene el efecto deseado. Así que no estoy seguro de por qué sería imposible programar. He encontrado esta página web ( blog.coriolis.ch/2008/03/04/traer-cualquier-escaparate-al-frente ) con la llamada Obj-C/Cocoa: SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); Sin embargo, no estoy lo suficientemente familiarizado con objc ni con cocoa como para saber qué hacer a partir de ahí.

4voto

Aidan Ryan Puntos 5056

Puedes hacer clic en los elementos del menú de las aplicaciones que no están activas. Se utiliza para hacer clic en el elemento de menú correspondiente a la ventana en la Ventana menú.

Esto es lo que tienes que insertar en tu script:

tell application "System Events"
    tell application process "Terminal"
        click menu item (name of theWin) of menu of menu bar item "Window" of menu bar 1
    end tell
end tell

Si bien no activa el programa, la ventana es más frontal.

0 votos

Casi. Eleva la ventana por encima de todas las demás ventanas EXCEPTO la ventana superior de la aplicación activa. Así que si tengo un navegador web maximizado o algo así, no tiene un efecto visible :/

0 votos

Esto solucionó el problema que tenía en el que obtenía un error con "AXRaise" al no entender la acción "perform"...

3voto

user50881 Puntos 121

Me doy cuenta de que este hilo es bastante viejo, pero me encontré con él mientras luchaba contra el mismo problema y otros pueden también. Por lo que puedo decir, no se puede hacer en AppleScript crudo. Sin embargo, se puede hacer en AppleScriptObjC. Para usar el ejemplo de @Daniel Beck, la nueva versión sería así.

property NSWorkspace : class "NSWorkspace"
set workspace to NSWorkspace's sharedWorkspace()
tell application "System Events"
    tell application process "Terminal"
        click menu item (name of theWin) of menu of menu bar item "Window" of menu bar 1
        workspace's launchApplication_("Terminal")
    end tell
end tell

El código añadido utilizará la clase de Cocoa NSWorkspace para "lanzar" la aplicación, que eleva sólo la ventana más frontal de esa aplicación al frente con el foco. Para más detalles sobre el proceso que me llevó a esto, tengo un escrito más completo en mi sitio web aquí .

1voto

Brecht Machiels Puntos 111

Aquí hay otro intento, probado en MacOS High Sierra. Por desgracia, esto sólo funciona cuando la ventana dada está en el escritorio actual. La API de AppleScript para controlar Windows parece estar incompleta, haciendo esto imposible.

Sustituye "Safari" y "WhatsApp" por tu caso de uso.

tell application "System Events"
    tell process "Safari"
        try
            set theWindow to (first window whose name contains "WhatsApp")
            perform action "AXRaise" of theWindow
            do shell script "open -a Safari"
        end try
    end tell
end tell

Sin embargo, esto eleva (visiblemente) las ventanas en dos pasos. Primero eleva la ventana a la parte superior de las ventanas de la aplicación, y sólo entonces la eleva a la parte superior de todas las ventanas. No es perfecto, pero es funcional.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X