AutoHotkey가 팝업 대화 상자를 자동으로 닫도록 만드는 방법은 무엇입니까?

AutoHotkey가 팝업 대화 상자를 자동으로 닫도록 만드는 방법은 무엇입니까?

질문

AutoHotkey가 특정 팝업 대화 상자가 나타날 때를 자동으로 감지하고 특정 작업을 수행하고 싶습니다. 어떻게 해야 하나요?

구체적인 예

내 특별한 경우에는 AutoHotkey가목차 업데이트목차를 업데이트하려고 하면 Word가 표시됩니다.

작업 흐름은 다음과 같습니다.

  1. 내 Word 문서의 제목을 업데이트합니다.

  2. Ctrl+를 눌러 A전체 문서를 선택합니다.

  3. F9모든 필드를 업데이트하려면 누르세요.

  4. 이 짜증나는 모달 대화 상자가 나타납니다(내 Google 검색에 따라 구성할 수 없음). 여기에 이미지 설명을 입력하세요

  5. 이제 눌러서 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

당신은 깊이 가고 있습니다. 특정 창 이름에 대한 프로그램 모니터를 갖는 것은 시스템 리소스에 큰 부담이 되지 않습니다. 아마도 그렇게 갈 것입니다.

ShellMessageOnMessage스크립트가 메시지를 수신할 때 트리거되는 에 의해 호출되는 함수이기 때문에 원하는 이름이 될 수 있습니다. 이 함수의 내용은 올바른 창에 있는지 확인하고 전송하려는 명령을 실행하는 코드여야 합니다. 함수는 최대 4개의 매개변수를 허용할 수 있습니다.도움말 파일에 정의된 대로을 위한 OnMessage.

DllCall줄은 시스템에서 메시지를 받기 위해 Windows에 연결되는 난해한 부분입니다. 여기가 Windows에 대한 후드 작업을 망칠 경우 무엇을 하고 있는지 알아야 하는 곳입니다.

SetBatchLines, -1그리고 Process, Priority,, High스크립트는 매우 중요하며 항상 최고 속도로 실행되어야 하며 다른 시스템 프로세스로 인해 속도가 느려져서는 안 된다고 말합니다.

Gui +LastFoundhWnd := WinExist()후속 .DllCall

답변2

폴링하지 않고 반응성이 뛰어난 효율적인 코드를 위해 여기에서 코드를 조정할 수 있습니다.

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

파일의 설정 부분에 다음 문을 추가합니다.

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를 보냅니다.

관련 정보