본문 바로가기

Autohotkey강좌

Autohotkey#48, ControlSend와 SetTitleMatchMode

반응형

https://youtu.be/VYvML03h9QI

Focusing된 Window에 키를 내보낼때는 Send, SendRaw, SendInput, SendPlay, SendEvent를 사용하면 되는데, Background Window에 키를 내보려면 어떻게 해야 할까요? 바로 CotrolSend나 ControlSendRaw등을 사용하면 됩니다.

사용문법은 다음과 같습니다.

ControlSend , Control, Keys, WinTitle, WinText, ExcludeTitle, ExcludeText

Raw가 있고 없고는 어떤 차이가 있을까요? 아래의 예를 보시죠.

ControlSend, Edit1, This is a line of text in the notepad window.{Enter}
ControlSendRaw, Edit1, Notice that {Enter} is not sent as an Enter keystroke with ControlSendRaw.

결과는 어떻게 될까요? 바로 아래처럼 나옵니다.

This is a line of text in the notepad window.
Notice that {Enter} is not sent as an Enter keystroke with ControlSendRaw.

즉 ControlSendRaw는 모든 키를 그대로 내보낸다고 보시면 됩니다. 원래 {Enter}는 보통 줄바꿈을 의미하는 Enter키이지만 ControlSendRaw에서는 그대로 보여집니다. 따라서 control, shift, alt등을 나타내는 ^, +, ! 등도 그대로 보여진다고 보시면 됩니다. 나머지 차이는 없습니다. 

이 함수를 사용하는 예제는 다음과 같은 시나리오로 만들어 봅니다.

F11을 누르면 Notepad.exe(메모장)를 실행시킨 후 최소화시키고 나서, background로 일부 키들을 내보냅니다. 그런 후에 최소화된 메모장을 불러옵니다. 

F12를 누르면 command창을 띄우고 나서 임의의 키값을 내보내서 명령이 제대로 실행되는지 확인해 보겠습니다.

그 과정에서 명령을 내보내기 위해서 Windows title에 해당하는 값을 써야 하는데 ahk_class, ahk_pid, ahk_exe등에 이어서 title의 전체를 모두 적을지 일부만 적을지등을 구분하려면 SetTitleMatchMode를 사용해서 지정하면 됩니다.

문법은 다음과 같습니다.

SetTitleMatchMode, MatchMode
SetTitleMatchMode, Speed

MatchMode에는 1, 2,3등을 사용할 수 있습니다.

1 : 앞에서부터 일치하는지 확인합니다.

2 : 타이틀 내에서 일치하는지 확인합니다.

3. 전체 일치하는지 확인합니다.

 

Speed의 경우 Fast, Slow가 있는데 Fast가 default이므로 신경쓰지 않아도 되겠습니다.

실제 예를 가지고 보시죠.

 

#controlSendexample.ahk

;SetTitleMatchMode, MatchMode 1 ;전방일치 2 ;중간 일치 3 ;완전일치
;SetTitleMatchMode, Speed ;fast slow
SetTitleMatchMode, 3 ;전방일치 2 ;중간 일치 3 ;완전일치
SetTitleMatchMode, slow  ; fast ; slow

test :="ipconfig"  

F11::
ifWinNotExist ahk_exe notepad.exe
{
Run, Notepad,, Min, pid  ; Run Notepad minimized.
WinWait, ahk_pid %pid%  ; Wait for it to appear.
} else {
WinGet, pid, PID, ahk_exe notepad.exe
}
sleep, 500
; controlsend, , %test% {enter} 
; controlsend, Edit1, %test% {enter} %test%%test%
; controlsend, Edit1, %test% {enter} %test%%test%, ahk_pid %pid%

controlsend, Edit1, %test% {enter} %test%%test%, ahk_class Notepad  ; 1 2 3

; 1 2 3
; controlsend, Edit1, %test% {enter} %test%%test%, 제목 없음 - Windows 메모장
; controlsend, Edit1, %test% {enter} %test%%test%, notepad.exe   ; not active any mode
; controlsend, Edit1, %test% {enter} %test%%test%, ahk_exe notepad.exe ; 1 2 3
sleep, 500
WinActivate, ahk_pid %pid% 
return

F12:: 
Run, %A_ComSpec%,,, PID  ; Run command prompt.
WinWait, ahk_pid %PID%  ; Wait for it to appear.
clipboard := test
ControlSendRaw,, %test% , ahk_pid %PID%  ; Send directly to the command prompt window.
ControlSend,, {enter} , ahk_pid %PID%     ; 1 2 3

; ControlSendRaw,, %test% , ahk_class Notepad ; Send directly to the command prompt window.
; ControlSend,, {enter} , ahk_class Notepad    ;not active any mode

; ControlSendRaw,, %test% , ahk_exe cmd.exe  ; Send directly to the command prompt window.
; ControlSend,, {enter} , ahk_exe cmd.exe   ; 1 2 3

; ControlSendRaw,, %test% , cmd.exe  ; Send directly to the command prompt window.
; ControlSend,, {enter} , cmd.exe  ; 2

; ControlSend,, ^v {enter} , cmd.exe  ; Send directly to the command prompt window.
; controlsend,, {ctrl down}v{ctrl up} , cmd.exe
; ControlSend,, ipconfig{Enter}, cmd.exe  ; Send directly to the command prompt window.
return

ESC::ExitApp
return

 

주석처리된 줄을 살리고 막으면서 각각 비교해 보시면 해당 의미를 파악하시는데 도움이 되리라 생각합니다.

스크립트는 아래와 같습니다.

controlsendexample.ahk
0.00MB

 

궁금한 점은 댓글로 질문 주세요.

반응형