Como fazer o AutoHotkey fechar automaticamente uma caixa de diálogo pop-up?

Como fazer o AutoHotkey fechar automaticamente uma caixa de diálogo pop-up?

Pergunta

Gostaria que o AutoHotkey detectasse automaticamente quando uma determinada caixa de diálogo pop-up aparecesse e executasse determinadas ações. Como faço isso?

Exemplo concreto

No meu caso particular, gostaria que o AutoHotkey fechasse oAtualizar índicecaixa de diálogo O Word é exibido quando desejo atualizar o índice analítico.

Este é o fluxo de trabalho:

  1. Eu atualizo os títulos no meu documento do Word

  2. Eu pressiono Ctrl+ Apara selecionar todo o documento

  3. Eu pressiono F9para atualizar todos os campos

  4. Esta caixa de diálogo modal irritante aparece (que não pode ser configurada de acordo com minhas pesquisas no Google) insira a descrição da imagem aqui

  5. Agora, preciso pressionar Arrow downpara selecionarAtualizar tabela inteiraseguido por Enterpara pressionarOKE continue

Gostaria que o AutoHotkey emitisse automaticamente o comando Arrow down, Enterporque o fluxo de trabalho descrito acima é algo que executo uma dúzia de vezes por dia.

Claro, como eu iniciei o fluxo de trabalho, eu poderia simplesmente escrever um script AutoHotkey que fizesse tudo para mim, começando com Ctrl+ Aassim:

#IfWinActive ahk_class OpusApp
F9::
Send, ^a
Send, {F9}
Sleep, 200
Send, {Down}
Send, {Enter}
return

No entanto, o exemplo acima é apenas para fins ilustrativos e há casos em que as caixas de diálogo pop-up aparecem aleatoriamente e eu gostaria que o AutoHotkey executasse alguma ação dependendo do título da caixa de diálogo pop-up.

Minha pesquisa até agora

  • Algumas fontes da Internet sugerem usar um loop AutoHotkeyque faz um loop indefinido e verifica, digamos a cada segundo, se existe uma janela com um determinado título e depois a fecha. Mas acho que isso é um desperdício de recursos da CPU
  • Algumas outras fontes da Internet mencionam umgancho de conchajunto com um trecho de código, e acho que esse é o caminho a seguir, mas não entendo o trecho de código; alguém poderia explicar como funciona e dar um exemplo compreensível, desde que essa fosse a solução?

O seguinte trecho de código écopiado daqui.

SetBatchLines, -1
Process, Priority,, High


Gui +LastFound
hWnd := WinExist()


DllCall( "RegisterShellHookWindow", UInt,hWnd )
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )
Return


ShellMessage( wParam,lParam ) {
  If ( wParam = 32772 or WParam = 4) ;  HSHELL_WINDOWACTIVATED := 4 or 32772
       WinGetActiveTitle, Title
  If  ( Title = "sun 4 - foxtrot - Remote Desktop Connection" ) 
        SetCapsLockState, on
    else SetCapsLockState, off
}

eu vejo o

If (Title = "sun 4 - foxtrot - Remote Desktop Connection") 

papel. O que todo o resto faz?

Responder1

Você está indo fundo. Ter um monitor de programa para um determinado nome de janela não representa um grande imposto sobre os recursos do sistema. Esse é provavelmente o caminho a seguir.

ShellMessagepode ser qualquer nome de sua escolha, pois é a função chamada por OnMessage, que é acionada quando seu script recebe uma mensagem. O conteúdo desta função deve ser o seu código para garantir que você esteja na janela correta e então emitir os comandos que deseja enviar. Sua função pode aceitar até quatro parâmetros,conforme definido no arquivo de ajudapara OnMessage.

As DllCalllinhas são a parte misteriosa que se conecta ao Windows para receber mensagens do sistema. É aqui que você deve saber o que está fazendo se quiser mexer no Windows.

SetBatchLines, -1e Process, Priority,, Highdiga que seu script é super importante e deve rodar em velocidade total o tempo todo e nenhum outro processo do sistema deve retardá-lo.

Gui +LastFounde hWnd := WinExist()estamos encontrando o ID exclusivo desse script quando ele está em execução para que possa ser registrado no Windows no futuro DllCall.

Responder2

Para um código eficiente que não faz pesquisas e é mais responsivo, você pode adaptar o código aqui:

http://www.autohotkey.com/board/topic/84397-winwait-framework-do-something-to-a-window-when-it-appears/

Na parte de configuração do arquivo, adicione estas instruções:

Update Table of Contents ahk_exe WINWORD.EXE    B       WordTOCupdate
Update Table of Figures ahk_exe WINWORD.EXE     B       WordTOCupdate

Certifique-se de que haja tabulações entre as colunas nesta parte de configuração do script (e não espaços, dependendo do editor que você está usando). O nome do exe também diferencia maiúsculas de minúsculas, pois usa correspondência RegEx, a menos que você o altere.

Então esse código vai para o corpo do script...

;-------------------------------------------------------
; Check for Microsoft Word Update Table of Contents
;-------------------------------------------------------
WordTOCupdate:
    WinActivate             ;Set Window to Be on top
    SendInput !e{Enter}
return

Você também pode usar o trecho que postou... é basicamente a mesma coisa.

Gui +LastFound
hWnd := WinExist()


DllCall( "RegisterShellHookWindow", UInt,hWnd )
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )
Return


ShellMessage( wParam,lParam ) {
  If ( wParam = 32772 or WParam = 4) ;  HSHELL_WINDOWACTIVATED := 4 or 32772
       WinGetActiveTitle, Title
  If  (Title="Update Table of Contents" ) 
  {
       SendInput !e{Enter}   
  }
} 

O !e envia Alt+e para atualizar a tabela inteira.

informação relacionada