Como fazer com que o AutoHotkey feche automaticamente uma caixa de diálogo pop-up?


3

Pergunta, questão

Eu gostaria que o AutoHotkey detecta automaticamente quando uma certa caixa de diálogo pop-up aparece e executa determinadas ações. Como faço isso?

Exemplo concreto

No meu caso específico, eu gostaria que o AutoHotkey fechasse a caixa de diálogo Atualizar sumário, que o Word exibe quando eu quero atualizar o sumário.

Este é o fluxo de trabalho:

  1. Eu atualizo os títulos no meu documento do Word
  2. Eu pressiono Ctrl+ Apara selecionar o documento inteiro
  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 selecionar Atualizar tabela inteira, seguido Enterde pressionar Ok e continuar

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

Obviamente, como eu inicio o fluxo de trabalho, eu poderia escrever um script AutoHotkey que faz 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 realizasse alguma ação, dependendo do título da caixa de diálogo pop-up.

Minha pesquisa até agora

  • Algumas fontes da Internet sugerem o uso de um loop AutoHotkey que faz loops e verificações indefinidamente, digamos a cada segundo, se existe uma janela com um determinado título e a fecha. Mas acho que é um desperdício de recursos da CPU
  • Algumas outras fontes da Internet mencionam um gancho de shell junto 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") 

parte. O que o que todo o resto faz?

Respostas:


0

Você está indo fundo. Ter um monitor de programa para um determinado nome de janela não é um grande imposto para os recursos do sistema. Provavelmente esse é o caminho a percorrer.

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

As DllCalllinhas são o bit arcano que se vincula ao Windows para obter mensagens do sistema. É aqui que você deve saber o que está fazendo se quiser mexer no capô do Windows.

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

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


0

Para um código eficiente que não pesquisa 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

Verifique se há guias entre as colunas nesta parte da 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 a correspondência RegEx, a menos que você o altere.

Então esse código entra no 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 snippet 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.

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.