script para restaurar / traer al frente de un programa, o abrirlo si no está activo


11

Estoy tratando de desarrollar un script que debería hacer lo siguiente. Por ejemplo, !Wdebería:

  • verificar si Word está activo (se puede abrir o minimizar)
  • si se minimiza, debe restaurarse al tamaño y la ubicación que tenía antes de la minimización
  • si está abierto, pero "oculto" detrás de otras ventanas abiertas, la secuencia de comandos debe llevarlo al frente, convirtiéndolo en la ventana activa / frontal
  • si no está minimizado ni abierto, el programa debe comenzar de nuevo

Me gustaría hacer esto para varios programas: !Wpara Word, !Npara Notepad ++, !Xpara Excel, !Ppara PowerPoint, !Fpara Firefox.

Si se están ejecutando varias instancias de un programa, o si hay varias pestañas disponibles, debe hacer lo anterior para la instancia o pestaña más reciente. Por lo tanto, cuando se abren varias ventanas de Firefox, debe restaurar (o traer al frente) la ventana vista más recientemente con la pestaña abierta más recientemente. Del mismo modo, si hay varios documentos de Word abiertos, debería hacerlo para el último en el que estaba trabajando. Y, si ningún documento de Word está abierto o minimizado, debería abrir una instancia de Word nueva.

Puedo hacer algunas de estas cosas, para algunos programas, pero no de manera consistente, ni en una tecla de acceso rápido (todavía estoy aprendiendo el lenguaje de secuencias de comandos). ¿Cómo podría lograr esto?

Respuestas:


14

Mi comprensión de cómo funciona la activación de Windows es bastante simple. Restaura la ventana de uso más reciente de ese tipo. Ese comportamiento predeterminado hace que la codificación de lo que quieres sea muy simple. De hecho, hago algo casi idéntico a lo que buscas con dos bloques de código simples.

+#w::
SetTitleMatchMode, 2 ; approximate match
IfWinExist, - Microsoft Word
{
WinActivate, - Micrsoft Word
}
IfWinNotExist, - Microsoft Word
{
Run FullFilePathToMicrosoftWord
}
return

Creé un poco de una sinergia interesante para trabajar con múltiples monitores. Tenga en cuenta que en Windows 7, si mantiene presionada la tecla Mayús + Windows y usa las flechas para navegar hacia la izquierda y hacia la derecha, la ventana activa se moverá entre los monitores a la velocidad de la luz. Así que probé algo un poco inteligente y asigné palabras a shift + window + w. Restaura la palabra si ya está abierta o ejecuta una nueva instancia si no. La belleza del enfoque es que nunca dejo ir la tecla Mayús + Windows. Al hacerlo, puedo activar / desactivar la palabra y moverla exactamente a la posición que quiero usando las teclas de flecha izquierda derecha (arriba se maximizará por cierto y abajo se minimizará). Map + # r para restaurar la ventana activa y controlar completamente todas las ventanas que normalmente usa sin esfuerzo sin el mouse. Todo lo que debe recordar es la primera letra de la aplicación que está intentando activar.

En respuesta a su consulta sobre cómo hacer que el script sea más genérico:

1) Considere usar

; Allows you to search for an approximate window title match
SetTitleMatchMode, 2  

; For example, you could do the following to activate any existing window with 
; "- Microsoft Word" as part of the title

WinWait, - Microsoft Word, 
IfWinNotActive, - Microsoft Word, , WinActivate, - Microsoft Word, 
WinWaitActive, - Microsoft Word,

; some other code here once you have the window active

U otra posibilidad:

;Active the window by finding its ahk_class
WinWait, ahk_class OpusApp, 
IfWinNotActive, ahk_class OpusApp, , WinActivate, ahk_class OpusApp, 
WinWaitActive, ahk_class OpusApp,

Nota: El código anterior fue solo una adaptación de la salida genérica del autoescritor. Es algo redundante pero efectivo. Para encontrar algo como ahk_class de una ventana, considere usar el espía de ventana AutoIt3.

Si necesita descubrir el título de una ventana, puede obtener el título activo como se muestra en el archivo de ayuda de ejemplo ahk

WinGetActiveTitle, Title
MsgBox, The active window is "%Title%".

Otro truco que puede usar es establecer el título activo usando WinSetTitle

Editar: dado que tiene varias instancias de excel / word / powerpoint flotando, también considere resolver ese problema con la edición gratuita de officetabs. Le permitirá mantener todos los archivos de Excel abiertos en una sola instancia, por ejemplo, en lugar de esparcir la barra de tareas.


¡Esto es perfecto! Grandes consejos y código muy útil. Voy a agregar un segundo monitor, por lo que parte de la respuesta también es muy apreciada.
Peter Verbeet

Por cierto, también me gusta el consejo de officetabs. No sabía que existía, pero se ve muy útil.
Peter Verbeet

Afortunadamente, el comando "Ejecutar, winword" funciona, por lo que parece que no tengo que proporcionar la ruta completa.
Peter Verbeet

@Coldrainwater: ¿Cómo necesitaría cambiar su script anterior para que funcione para Google Chrome? El problema es que el título cambia según el sitio web que esté abierto.
Lernkurve

1

Veo que ya conoces el magnífico lenguaje Autohotkey;). Yo usaría:

  • ifWinActive; verificar si la ventana está activa
  • WinGet, salida, MinMax; verificar si la ventana está minimizada
  • ifWinExists; verificar si existe una ventana (pero no está activa)
  • Correr ; ejecuta el programa si no hay ningún proceso asociado
  • Orden Z / WinList; esos le ayudarán a enumerar todas las instancias / determinar qué instancia es la primera

Si tiene más preguntas, definitivamente debe preguntarlas en el foro de autohotkey.

; The script activates a Word 2007 window
; The script uses 'winTitle' and 'winClass' variables to match the window
; so set those properly first.
; Press Shift + 1 + w to see how the script works.
;
winTitle := "Document1 - Microsoft Word" ; use Autoit Window Spy to get this
winClass := "OpusApp"
RunWait, winword
return

+1::
    KeyWait, w, D T1 ; KeyboardHook not needed
    if(errorlevel) {
        msgbox, % """Shift + 1 + w"" failed"
        return
    }
    Send, {Backspace} ; erase 'w'
    IfWinNotActive, %winTitle%
    {
        WinActivate, %winTitle%
        WinWaitActive, %winTitle%, , 3
        if(errorlevel)
            MsgBox, % "Failed to activate the window."
    } 
    else ; Last Found Window set
    {
        MsgBox, % "Window already activated."

    }
return


F11::Reload

Gracias. He estado jugando con estos, pero realmente no sé cómo obtener un bucle eficaz si no existe allí. Entonces, si IfWinActive es falso, ¿cómo ejecuto el comando Ejecutar apropiado como parte de un comando else?
Peter Verbeet

@PeterVerbeet: ver la edición. He usado la versión inglesa de Word 2007. Presione Mayús + 1 + w para ver cómo funciona el script.
colemik

He editado esto algunas veces.
colemik

Gracias trismarck, eso es realmente útil. Funciona muy bien ¿Hay alguna manera de hacerlo más "genérico"? Me gustaría que esto se ejecute independientemente de qué documento está siendo editado actualmente por Word. Me parece que tendría que cambiar el nombre manualmente en el script cada vez (uso mucho Word y rara vez uso "Documento1". ¿Se puede hacer al verificar si Word está activo, independientemente de qué documento sea? activo?
Peter Verbeet

1

Puede que no sea tan complicado como algunos, pero esto es lo que uso para iniciar la mayoría de mis programas. La palanca le permite minimizar la ventana si ya está activa.

^NumpadDot::ShowStart("Google Chrome", "chrome.exe")

ShowStart(title, exe, toggle = 0)
{
    If WinActive(title) and toggle
        WinMinimize %title%
    Else
        {
            IfWinExist, %title%
                WinActivate
            else
            {
                Run, %exe%
                WinActivate
            }
        }
}

¿No se alternará siempre 0?
Sam Hasler

0

Así es como resolví este problema por mí mismo. /superuser//a/1405409/997992 Olvidé mencionar en la publicación original que estoy usando un complemento de Windows llamado administrador de Windows real, por eso tengo un cheque adicional con WinExist para el administrador de Windows actual O explorer.exe.

Espero que esto ayude.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.