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


11

Estou tentando desenvolver um script que deve fazer o seguinte. Por exemplo, !Wdeve:

  • 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 "escondido" atrás de outras janelas abertas, o script deve trazê-lo para a frente, tornando-a na janela mais à frente / ativa
  • se não for minimizado nem aberto, o programa deve ser iniciado recentemente

Eu gostaria de fazer isso em vários programas: !Wpara Word, !Npara Notepad ++, !Xpara excel, !Ppara powerpoint, !Fpara Firefox.

Se várias instâncias de um programa estiverem em execução ou se houver várias guias disponíveis, faça o procedimento acima para a instância ou guia mais recente. Portanto, quando várias janelas do Firefox estiverem abertas, ele deverá 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, faça 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 do word.

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

Respostas:


14

Meu entendimento de como a Ativação de Janelas funciona é bastante simples. Restaura a janela de uso mais recente desse tipo. Esse comportamento padrão simplifica a codificação do que você deseja. Na verdade, faço algo quase idêntico ao que você procura com dois blocos de código simples.

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

Criei uma sinergia interessante para trabalhar com vários monitores. Observe que no Windows 7, pressionar 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, tentei algo um pouco inteligente e mapeei a palavra para shift + window + w. Restaura a palavra se já estiver aberta ou executa uma nova instância, se não estiver. A beleza da abordagem é que eu nunca larguei a tecla shift + windows key. Ao fazer isso, posso ativar / iniciar a palavra e movê-la para exatamente a posição desejada, usando as teclas de seta para a esquerda (a seta para cima é maximizada pelo caminho e a parte de baixo é minimizada). Mapeie + # r para restaurar a janela ativa e você controla completamente todas as janelas que você normalmente usa sem esforço, sem o mouse. Tudo o que você deve se lembrar é a primeira letra do aplicativo que você está tentando ativar.

Em resposta à sua pergunta sobre como tornar o script mais 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

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 gravador automático. É um pouco redundante, mas eficaz. Para encontrar algo como o ahk_class de uma janela, considere usar o espião de janelas AutoIt3.

Se você precisar descobrir o título de uma janela, poderá obter um título ativo, conforme mostrado no arquivo de ajuda do exemplo 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 do excel / word / powerpoint flutuando, considere também resolver esse problema com a edição gratuita do officetabs. Isso permitirá que você mantenha todos os arquivos do Excel abertos em uma única instância, por exemplo, em vez de espalhar a barra de tarefas.


Isto é perfeito! Ótimas dicas e código muito útil. Vou adicionar um segundo monitor, para que parte da resposta também seja muito apreciada.
Peter Verbeet

A propósito, eu também gosto da dica do officetabs. Eu não sabia que existia, mas parece muito útil.
Peter Verbeet

Felizmente, o comando "Run, winword" funciona, então parece que não preciso fornecer o caminho completo.
Peter Verbeet

@ Coldwaterwater: Como seria necessário alterar seu script acima para fazê-lo funcionar no Google Chrome? O problema é que o título muda dependendo do site que está aberto.
Lernkurve

1

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 está minimizada
  • ifWinExists; verifique se a janela existe (mas não está ativa)
  • Corre ; execute o programa se nenhum processo associado
  • Ordem Z / WinList; eles ajudarão a listar todas as instâncias / determinar qual é a primeira

Se você tiver mais dúvidas, pergunte-as definitivamente no fórum da 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

Obrigado. Eu tenho brincado com isso, mas realmente não sei como obter um loop if-else eficaz lá. Portanto, se IfWinActive for falso, como inicio o comando Executar apropriado como parte de um comando else?
Peter Verbeet

@ PeterVerbeet: veja a edição. Eu usei a versão em inglês do Word 2007. Pressione Shift + 1 + w para ver como o script funciona.
Colemik

Eu editei isso algumas vezes.
Colemik

Obrigado trismarck, isso é realmente útil. Isso funciona muito bem. Existe uma maneira de torná-lo mais "genérico"? Eu gostaria que isso fosse executado independentemente do documento que está sendo editado atualmente pelo Word. Parece-me que eu precisaria alterar o nome manualmente no script todas as vezes (uso muito o Word e raramente uso o "Documento1". Isso pode ser feito verificando se o próprio Word está ativo, independentemente de qual documento seja Ativo?
Peter Verbeet

1

Pode não ser tão complicado quanto alguns, mas aqui está o que eu uso para iniciar 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
            }
        }
}

não alternará sempre 0?
Sam Hasler

0

Foi assim que resolvi esse problema sozinho. /superuser//a/1405409/997992 Eu esqueci de mencionar no post original que estou usando um add-on do Windows chamado gerenciador de janelas real, e é por isso que tenho uma verificação extra com o WinExist para o realwindowsmanager OU explorer.exe.

Espero que isto ajude.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.