script para restaurar / trazer para frente de um programa ou abri-lo se ele não estiver ativo

9

Estou tentando desenvolver um script que faça o seguinte. Por exemplo, !W deve:

  • verifique se o Word está ativo (pode ser aberto ou minimizado)
  • se for minimizado, ele deve ser restaurado para o tamanho e o local que tinha antes da minimização
  • se estiver aberto, mas "oculto" por trás de outras janelas abertas, o script deve trazê-lo para a frente, tornando-se a janela frontmost / active
  • se não estiver nem minimizado nem aberto, o programa deve ser iniciado recentemente

Eu gostaria de fazer isso em vários programas: !W para Word, !N para Notepad ++, !X para excel, !P para powerpoint, !F para Firefox.

Se várias instâncias de um programa estiverem sendo executadas, ou se várias guias estiverem disponíveis, faça o acima para a instância ou guia mais recente. Assim, quando várias janelas do Firefox estão abertas, ele deve restaurar (ou trazer para a frente) a janela visualizada mais recentemente com a guia aberta mais recentemente. Da mesma forma, se vários documentos do Word estiverem abertos, ele deve fazer isso para o que eu estava trabalhando pela última vez. E, se nenhum documento do Word estiver aberto ou minimizado, ele deverá abrir uma nova instância de palavra.

Eu posso fazer algumas dessas coisas, para alguns programas, mas não de forma consistente, nem em uma tecla de atalho (ainda estou aprendendo a linguagem de script). Como eu poderia conseguir isso?

    
por Peter Verbeet 20.05.2012 / 18:27

3 respostas

12

Meu entendimento de como o Windows Activation funciona é bem simples. Ele restaura a janela de uso mais recente desse tipo. Esse comportamento padrão faz com que codificar o que você quer seja muito simples. Na verdade, faço algo quase idêntico ao que você está procurando com dois blocos de código simples.

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

Eu criei uma sinergia interessante para trabalhar com vários monitores. Observe que, no Windows 7, manter pressionada a tecla shift + windows e usar as setas para navegar para a esquerda e para a direita moverá a janela ativa entre os monitores na velocidade da luz. Então eu tentei algo um pouco inteligente e mapeou a palavra para mudar + janela + w. Ele restaura a palavra se já estiver aberto ou executa uma nova instância, se não estiver. A beleza da abordagem é que eu nunca abandone a tecla shift + windows. Ao fazer isso, posso ativar / iniciar a palavra e movê-la exatamente para a posição desejada, usando as teclas de seta para a esquerda à esquerda (o número máximo será maximizado). Mapear + # r para restaurar a janela ativa e você controla completamente todas as janelas que você usa normalmente sem o mouse. Tudo o que você precisa lembrar é a primeira letra do aplicativo que está tentando ativar.

Em resposta à sua consulta sobre como tornar o script mais genérico:

1) Considere o uso de

; 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

Ou outra possibilidade:

;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: O código acima foi apenas uma adaptação da saída genérica do autoscriptwriter. É um pouco redundante, mas eficaz. Para encontrar algo como ahk_class de uma janela, considere usar o espião da janela AutoIt3.

Se você precisar descobrir o título de uma janela, poderá obter o título ativo, conforme mostrado no arquivo de ajuda do exemplo do ahk

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

Outro truque que você pode usar é definir o título ativo usando o WinSetTitle

Edit: Dado que você tem várias instâncias de excel / word / powerpoint por aí, considere também resolver esse problema com a edição gratuita do officetabs. Ele permitirá que você mantenha todos os arquivos abertos do Excel em uma única instância, por exemplo, em vez de se espalhar pela barra de tarefas.

    
por 22.05.2012 / 02:32
1

Eu vejo que você já conhece a magnífica linguagem Autohotkey;). Eu usaria:

  • ifWinActive; verifique se a janela está ativa
  • WinGet, saída, MinMax; verifique se a janela foi minimizada
  • ifWinExists; verifique se a janela existe (mas não ativa)
  • Executar; executar o programa se nenhum processo associado
  • Ordem Z / WinList; esses ajudarão você a listar todas as instâncias / determinar qual instância é a primeira

Se você tiver mais perguntas, você deve definitivamente perguntar no fórum 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
    
por 20.05.2012 / 18:50
1

Pode não ser tão complicado quanto alguns, mas aqui está o que eu uso para lançar a maioria dos meus programas. A alternância permite minimizar a janela se ela já estiver ativa.

^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
            }
        }
}
    
por 01.10.2012 / 22:59

Tags