
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:
Eu atualizo os títulos no meu documento do Word
Eu pressiono Ctrl+ Apara selecionar todo o documento
Eu pressiono F9para atualizar todos os campos
Esta caixa de diálogo modal irritante aparece (que não pode ser configurada de acordo com minhas pesquisas no Google)
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.
ShellMessage
pode 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 DllCall
linhas 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, -1
e Process, Priority,, High
diga que seu script é super importante e deve rodar em velocidade total o tempo todo e nenhum outro processo do sistema deve retardá-lo.
Gui +LastFound
e 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:
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.