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
주석처리된 줄을 살리고 막으면서 각각 비교해 보시면 해당 의미를 파악하시는데 도움이 되리라 생각합니다.
스크립트는 아래와 같습니다.
궁금한 점은 댓글로 질문 주세요.
'Autohotkey강좌' 카테고리의 다른 글
Autohotkey #50, 오토핫키로 OCR(광학문자인식) (0) | 2022.03.09 |
---|---|
Autohotkey#49, 고정IP/유동IP Setting 자동화 (0) | 2022.02.21 |
Autohotkey #47. Notepad++로 Autohotkey 스크립트 디버깅하기 (0) | 2022.01.29 |
Autohotkey#46, RandBetween, 특정 범위에서 실수 난수(Random number) 발생하기 (0) | 2022.01.17 |
Autohotkey#45, 엑셀 취합 v1.6(입력파일의 특정열을 취합파일의 다른 열에 복사하는 경우) (0) | 2022.01.07 |