Como fazer o AutoHotkey fechar automaticamente um diálogo pop-up?

2

Pergunta

Eu gostaria que o AutoHotkey detectasse automaticamente quando uma determinada caixa de diálogo aparecesse e tomasse certas ações. Como eu faço isso?

Exemplo concreto

No meu caso particular, eu gostaria que o AutoHotkey fechasse a caixa de diálogo Atualizar tabela de conteúdo que o Word exibe quando eu quiser atualizar o índice.

Este é o fluxo de trabalho:

  1. atualizo os títulos no meu documento do Word
  2. Pressiono Ctrl + A para selecionar o documento inteiro
  3. Eu pressiono F9 para 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)

  5. Agora,euprecisopressionarSetaparabaixoparaselecionarAtualizartabelainteiraseguidoporEnterparapressionarOkecontinue

EugostariaqueoAutoHotkeyemitisseautomaticamenteocomandoSetaparabaixo,Enterporqueofluxodetrabalhodescritoacimaéalgoqueexecutoumadúziadevezespordia.

Claro,porqueeuinicieiofluxodetrabalho,eupoderiaapenasescreverumscriptAutoHotkeyquefazacoisatodaparamim,começandocomCtrl+Aassim:

#IfWinActiveahk_classOpusAppF9::Send,^aSend,{F9}Sleep,200Send,{Down}Send,{Enter}return

Noentanto,oexemploacimaéapenasparafinsilustrativos,ehácasosemqueascaixasdediálogopop-upaparecemaleatoriamenteegostariaqueoAutoHotkeyexecutassealgumaação,dependendodotítulodacaixadediálogopop-up.

Minhapesquisaatéagora

  • Algumas fontes da Internet sugerem o uso de um loop AutoHotkey que indefinidamente faz um loop e verifica, digamos a cada segundo, se existe uma janela com um certo título e depois a fecha. Mas acho que ser 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 eu 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
}

vejo o

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

parte. O que todo o resto faz?

    
por Lernkurve 12.09.2015 / 10:47

2 respostas

0

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

ShellMessage poderia ser qualquer nome de sua escolha, porque é a função chamada por OnMessage , que é o que é acionado quando seu script recebe uma mensagem. O conteúdo desta função deve ser o seu código para certificar-se de que você está na janela correta e depois emitir os comandos que você deseja enviar. Sua função pode aceitar até quatro parâmetros, conforme definido no arquivo de ajuda para OnMessage .

As linhas DllCall são o bit arcano que se liga ao Windows para obter mensagens do sistema. É aqui que você deve saber o que está fazendo se for mexer com o capuz no Windows.

SetBatchLines, -1 e Process, Priority,, High dizem que o seu script é super importante e deve ser executado a todo o momento e nenhum outro processo do sistema deve atrasá-lo.

Gui +LastFound e hWnd := WinExist() estão encontrando o ID exclusivo desse script quando ele está em execução, para que ele possa ser registrado no Windows no subseqüente DllCall .

    
por 13.09.2015 / 19:56
0

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

link

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 existem guias entre as colunas nessa parte do script (e não espaços, dependendo do editor que você está usando). O nome exe também faz distinção entre maiúsculas e minúsculas, pois ele usa a correspondência RegEx, a menos que você o altere.

Então esse código fica 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 você 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.

    
por 22.09.2015 / 07:12

Tags