
질문
AutoHotkey가 특정 팝업 대화 상자가 나타날 때를 자동으로 감지하고 특정 작업을 수행하고 싶습니다. 어떻게 해야 하나요?
구체적인 예
내 특별한 경우에는 AutoHotkey가목차 업데이트목차를 업데이트하려고 하면 Word가 표시됩니다.
작업 흐름은 다음과 같습니다.
내 Word 문서의 제목을 업데이트합니다.
Ctrl+를 눌러 A전체 문서를 선택합니다.
F9모든 필드를 업데이트하려면 누르세요.
이제 눌러서 Arrow down선택 해야 합니다.전체 테이블 업데이트다음으로 Enter누르기좋아요그리고 계속
위에서 설명한 작업 흐름은 제가 하루에 수십 번 수행하는 작업이기 때문에 AutoHotkey가 자동으로 Arrow down, 명령을 실행하도록 하고 싶습니다 .Enter
물론, 내가 작업 흐름을 시작하기 때문에 다음과 같이 Ctrl+ 로 시작하는 모든 작업을 수행하는 AutoHotkey 스크립트를 작성할 수도 있습니다 A.
#IfWinActive ahk_class OpusApp
F9::
Send, ^a
Send, {F9}
Sleep, 200
Send, {Down}
Send, {Enter}
return
그러나 위의 예는 설명을 위한 것일 뿐이며 팝업 대화 상자가 무작위로 나타나는 경우가 있으며 AutoHotkey가 팝업 대화 상자의 제목에 따라 어떤 작업을 수행하기를 원합니다.
지금까지 나의 연구
- 일부 인터넷 소스에서는 AutoHotkey 루프 사용을 제안합니다.매초마다 특정 제목의 창이 존재하는지 여부를 무한 반복하고 확인한 다음 닫습니다. 하지만 CPU 리소스 낭비라고 생각합니다.
- 다른 인터넷 소스에서는 다음을 언급합니다.쉘 후크코드 조각과 함께, 그게 갈 길이라고 생각하지만 코드 조각을 이해하지 못합니다. 이것이 어떻게 작동하는지 설명하고 이것이 해결책이라면 이해할 수 있는 예를 줄 수 있는 사람이 있습니까?
다음 코드 조각은여기에서 복사했습니다.
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
}
나는 본다
If (Title = "sun 4 - foxtrot - Remote Desktop Connection")
부분. 나머지 전체는 무엇을 합니까?
답변1
당신은 깊이 가고 있습니다. 특정 창 이름에 대한 프로그램 모니터를 갖는 것은 시스템 리소스에 큰 부담이 되지 않습니다. 아마도 그렇게 갈 것입니다.
ShellMessage
OnMessage
스크립트가 메시지를 수신할 때 트리거되는 에 의해 호출되는 함수이기 때문에 원하는 이름이 될 수 있습니다. 이 함수의 내용은 올바른 창에 있는지 확인하고 전송하려는 명령을 실행하는 코드여야 합니다. 함수는 최대 4개의 매개변수를 허용할 수 있습니다.도움말 파일에 정의된 대로을 위한 OnMessage
.
이 DllCall
줄은 시스템에서 메시지를 받기 위해 Windows에 연결되는 난해한 부분입니다. 여기가 Windows에 대한 후드 작업을 망칠 경우 무엇을 하고 있는지 알아야 하는 곳입니다.
SetBatchLines, -1
그리고 Process, Priority,, High
스크립트는 매우 중요하며 항상 최고 속도로 실행되어야 하며 다른 시스템 프로세스로 인해 속도가 느려져서는 안 된다고 말합니다.
Gui +LastFound
hWnd := WinExist()
후속 .DllCall
답변2
폴링하지 않고 반응성이 뛰어난 효율적인 코드를 위해 여기에서 코드를 조정할 수 있습니다.
파일의 설정 부분에 다음 문을 추가합니다.
Update Table of Contents ahk_exe WINWORD.EXE B WordTOCupdate
Update Table of Figures ahk_exe WINWORD.EXE B WordTOCupdate
스크립트의 이 설정 부분에 있는 열 사이에 탭이 있는지 확인하세요(사용 중인 편집기에 따라 공백이 아님). exe 이름은 변경하지 않는 한 RegEx 일치를 사용하므로 대소문자를 구분합니다.
그런 다음 이 코드는 스크립트 본문에 표시됩니다.
;-------------------------------------------------------
; Check for Microsoft Word Update Table of Contents
;-------------------------------------------------------
WordTOCupdate:
WinActivate ;Set Window to Be on top
SendInput !e{Enter}
return
게시한 스니펫을 사용할 수도 있습니다. 기본적으로 동일합니다.
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}
}
}
!e는 전체 테이블을 업데이트하기 위해 Alt+e를 보냅니다.