자동화는 오토핫키가 가장 특화한 영역입니다. 많은 분들이 오토핫키에 발을 들이는 이유이기도하지요.
이 글을 읽고나면 업무자동화 등 반복적인 작업을 자동화하는 프로그램은 직접 제작하실수있습니다.
ㅡ 오토핫키에 아직 미숙하신 분은 여기를 클릭해 소스코드 생성과 컴파일방법을 확인하세요.
ㅡ 이 글은 반복적인 작업자동화 프로그램 제작 강의글입니다.
ㅡ 소스코드 작성에 필요한 모든 명령어,문법 등을 다룹니다. 따라서, 방대한 글이 될 것입니다.
ㅡ AutoHotkey_L 1.1.19.1 유니코드 버전에서 작성했습니다. 설치는 여기를 클릭하세요
ㅡ 오토핫키 공식에디터 Scite4AutoHotkey 를 사용합니다. 설치는 여기를 클릭하세요
- ㅡ [필수] HotKey 지정문법
- ㅡ [필수] Send / SendPlay / SendInput / SendMode
- ㅡ [필수] Click / MouseClick / CoordMode
- ㅡ [필수] Sleep
- ㅡ [필수] Loop / Break / Continue
- ㅡ [필수] If / Else / 변수 표현식
- ㅡ [옵션] ImageSearch / PixelSearch
- ㅡ [옵션] ControlSend / ControlClick
- ㅡ [옵션] Run / RunWait
- ㅡ [옵션] SetTimer / Critical
- ㅡ [옵션] WinActivate / WinWaitActive
- ㅡ [옵션] Gui 문법 / MsgBox / Reload 문법
- ㅡ [옵션] 자세한 Expression / 연산자 / 변수 문법
- ㅡ [옵션] SingleInstance / 스크립트 설정 문법
- ㅡ [옵션] Object / Array 문법
- ㅡ [옵션] ActiveX 문법 / 웹 자동화
1. HotKey 지정문법
HotKey 핫키 는 키보드 키 또는 키조합입니다. 핫키를 설정한 다음에 핫키를 누름으로써 특정액션을 취하게 설정할 수 있습니다.
MsgBox, A키 눌렀네
Return ; 여기까지 실행하고 끝낸다
※ 세미콜론 ; 는 주석으로 일종의 코멘트입니다. ; 이후의 말은 코드실행에 아무런 영향을 주지않습니다.
위 소스코드를 적고, 실행해보세요. 키보드 A(한글 ㅁ)키를 누르면 "A키 눌렀네" 라는 메시지박스가 나옵니다.
HotKey 정리
따라서, 핫키를 지정하고 사용하는 방법은 아래와 같습니다.
핫키를 눌렀을시 실행할 명령어
Return
추가로, 핫키지정은 'A' 처럼 단독 키뿐만아니라 컨트롤(Ctrl), 알트(Alt), 키와 조합이 가능합니다.
ㅡ 컨트롤(Ctrl) 키는 ^ 로 표현하고
ㅡ 알트(Alt) 키는 ! 로 표현합니다
MsgBox, 컨트롤 + A 키를 눌렀네요
Return
MsgBox, 알트 + A키를 눌렀네요
Return
2. Send / SendPlay / SendInput / SendMode
Send 는 키보드입력을 보내는 명령어입니다.
SendPlay 는 게임키입력에 최적화되어있는 Send명령어입니다. (한글입력 불가)
SendInput 은 Send보다 빠르고 안정적인 Send입니다.
Send, 이것이 Send명령어입니다 {Enter} ; 이것이 Send명령어입니다 입력후 엔터
SendPlay, This is SendPlay {Enter} ; This is SendPlay 입력후 엔터
SendInput, 이것은 SendInput {Enter} ; 이것은 SendInput 입력후 엔터
return
위 소스코드에서 확인할수있듯이,
엔터와 같은 키보드 자체의 키를 표현하기 위해서는 { } 괄호를 사용해야합니다.
Enter 로 적으면 엔터키가 아니라 "Enter" 라는 문자를 적겠죠.
따라서 컨트롤키는 {Ctrl}, 알트키는 {Alt}, 스페이스바는 {Space}, Esc는 {Esc}, Home 키는 {Home}, PgUp키는 {PgUp} 등으로 표시해야합니다.
Send와 SendPlay 그리고 SendInput 등 따로따로 적어서 사용할수도 있지만
SendMode, 사용할모드 를 적어주면 Send로도 Send사용모드 로 자동변환되어 사용할 수 있습니다.
아래 코드를 확인하죠
Send, {a} ; SendInput, {a} 와 동일한 성능을 구현합니다.
Send, {A}
return
추가로, 위 코드의 결과에서 {a} 와 {A} 가 어떻게 다른지 확인이 가능하죠?
Send, {a} 는 소문자 a를 입력하고
Send, {A} 는 대문자 A를 입력합니다.
Send 정리
따라서, Send는 아래의 예처럼 사용합니다.
Send, 입력할 문자/문자열
Send, {입력할 키}
return
3. Click / MouseClick / CoordMode
두 명령어 둘다 마우스클릭을 합니다.그러나 Click이 MouseClick 보다 간단해서 더 자주 사용합니다.
Click |
현재 마우스커서 위치에서 마우스왼쪽버튼 클릭 |
Click 44,55 |
컴퓨터화면 x좌표 44 y좌표 55 지점을 마우스 왼쪽클릭 |
Click Right 44, 55 |
컴퓨터화면 x좌표 44 y좌표 55 지점을 마우스 오른쪽클릭 |
Click 2 |
현재 마우스커서 위치 마우스왼쪽버튼 2번 클릭 |
Click Down |
마우스 왼쪽 버튼을 누르고 있는다. |
Click Up Right |
마우스 오른쪽 버튼을 뗀다. |
Click %변수1%, %변수2% |
컴퓨터화면 x좌표 변수1, y좌표 변수2를 마우스 왼쪽클릭 |
Click 명령어에서 사용되는 X좌표와 Y좌표는 CoordMode 좌표설정명령어의 영향을 받습니다.
따로 CoordMode 명령어를 명시하지않을시, Screen 좌표로 설정됩니다.
가능한 Screen 좌표는 사용하지않는것이 좋습니다. 밑으로 내려가면서 이유를 설명하죠
Screen 좌표는 컴퓨터 전체화면에서의 좌표를 뜻합니다.
컴퓨터 해상도 1920 * 1080 의 경우 화면 왼쪽 맨위에서부터 0,0으로 좌표는 시작됩니다.
오른쪽으로 갈수록, X좌표값이 증가하고
아래로 내려갈수록, Y좌표값이 증가합니다.
그러므로, 화면 오른쪽 맨아래의 좌표는 1920, 1080 이 됩니다.
정확한 좌표를 확인하기 위하여 오토핫키 설치시 제공되는 프로그램을 이용해보겠습니다.
본인 컴퓨터의 오토핫키 설치폴더로 가면 'AU3_Spy.exe' 이라는 파일이 있습니다, 실행하세요.
실행하고, 바탕화면 빈공간을 클릭해보세요.
사진의 빨간색으로 표시한 부분에서
Absolute, Relative 그리고 Client 가 보이시나요?
Absolute 는 Screen 좌표를 뜻합니다. = 컴퓨터의 전체화면에서의 좌표
Relative 는 활성창의 좌표를 뜻합니다.= 활성창의 좌표, 현재는 활성창이 바탕화면
Client 는 활성창의 작업창(최소호,최대화,닫기)를 제외한 좌표를 뜻합니다. = 사용빈도 X
위에서 Screen 좌표를 사용을 최대한 지양하라 했습니다.
그 이유의 예로는,
스크린 좌표를 이용해서 프로그램 내의 특정부분을 클릭하게 만든 경우
프로그램의 위치를 이동하면 엉뚱한 부분을 클릭하기 떄문입니다.
위 사진은 활성창이 바탕화면이기 때문에 Screen좌표와 Relative 활성창좌표가 동일한것일뿐
따라서 무조건 프로그램 자체내의 좌표, =활성창 좌표 Relative 를 이용하는 것이 좋습니다.
활성창좌표는 창을 기준으로 (0, 0) ~ (창크기X좌표, 창크기Y좌표) 로 되어있겠네요.
한번 활성창좌표와 Click 을 사용하여 에디터창의 스크립트실행 버튼을 눌러보도록 하겠습니다.
에디터 Sctie4AutoHotkey 의 스크립트시작 버튼의 Relative 좌표를 확인해야겠죠?
X좌표 397, Y좌표 64이네요.
또한 소스코드에 Click 명령어가 클릭하는 좌표가 활성창좌표라는 것을 명시해야합니다.
CoordMode, Relative 로 적어두면 소스코드에 표기하는 모든 좌표를 활성창 기준으로 잡습니다.
Click 397,64 ; 활성창 397, 64 좌표를 클릭
return
실행결과는 예상한대로입니다. 시작버튼을 클릭하네요!
그런데 스크립트를 실행시킨상태에서 또 다시 시작버튼을 누르면 아래와 같은 확인메시지가 출력됩니다.
이미 스크립트가 실행되고 있으므로, 새로 실행할 것인지 묻는 메시지군요
'예' 를 누르면 새로실행할것이고, '아니요'는 새로실행하지 않습니다.
위 메시지와 관련한 모든부분은 [옵션]의 SingleInstance / Reload 부분에서 다룹니다.
Click 정리
따라서, Click 명령어는 아래의 예처럼 사용합니다.
Click, x좌표, y좌표 ; 활성창 x좌표 y좌표 클릭
return
4. Sleep
키보드, 마우스입력을 했다가 잠시쉬고 다시 입력을 보내고 싶으시죠?
잠시 쉬는것이 'Sleep' 명령어입니다.
Send, 안 ; '안' 입력
Sleep, 3000 ; 3000 밀리세컨드 즉, 3초동안 쉰다
Send, 녕 ; '녕' 입력
return
밀리세컨드로 시간을 표기해야하므로, 1초는 1000 이 되고, 5.5초는 5500 이 되겠습니다.
Sleep 정리
따라서, Sleep 명령어는 아래의 예처럼 사용합니다.
명령어 1
Sleep, 밀리세컨드
명령어 2
Sleep, 밀리세컨드
명령어 3
명령어 4
Sleep, 밀리세컨드
return
5. Loop / Break / Continue
Loop는 반복문입니다. Break와 Continue는 반복문을 제어하는 명령어이구요.
A키를 반복적으로 입력하거나, 오토마우스 처럼 한 위치를 계속해서 클릭하고 싶을때 Loop를 사용합니다.
설마 아래처럼 하시는 분은 없겠죠...
Send, A
Send, A
Send, A
Send, A
Send, A
return
Loop를 이용하면 아래처럼 소스를 작성할 수 있습니다.
Loop, 5 ; 괄호안의 명령어를 5번만큼 반복한다
{
Send, A
}
return
Loop명령어는 폴더개수, 특정 확장자 파일의 개수와 모든이름을 구하는등 다양한 활용이 가능하지만
이 글에서는 명령어반복만을 강의하도록 하겠습니다.
계속해서 진행하죠
Loop, 5
{
Send, 안녕하세요 {Enter}
}
MsgBox, 끝났네요
return
위 코드의 실행결과가 어떨지 예상이 되시나요?
Loop 괄호 { } 안의 명령어를 5번만큼 반복하고, 괄호밖을 나오게되는데
괄호 밖의 MsgBox 명령어를 만나 '끝났네요' 라는 메시지를 띄우고 return을 만나 끝납니다.
반복할 횟수를 생략한다면 무한반복이 됩니다.
Loop
{
MsgBox, 이 창은 계속 뜹니다
}
return
무한반복을 종료하는 방법으로 Break 를 이용합니다.
그전에 먼저 A_Index 라는 오토핫키의 반복문 내장변수에 대해 짚고 넘어가겠습니다.
A_index (대소문자 구별X) 은 반복문이 몇번째로 실행중인지 카운트해주는 내장변수입니다.
내장변수 = 자체적으로 값이 설정되는 변수
Loop
{
MsgBox, % A_Index
if (A_Index = 5)
break
}
MsgBox, 5번 실행하고 나왔네요
return
위 코드의 결과는 아래와 같습니다
if (A_Index = 5)
break
이 부분을 설명해보겠습니다, A_Index 는 반복문의 실행횟수를 저장하는 변수라고 했습니다.
그 변수를 메시지박스로 표현하려면 % 퍼센트 표시를 붙여줘야합니다.
% 없이 적는다면 "A_Index" 라는 글자를 보여주기 때문이죠.
% 표기를 함으로써, 문자나 숫자가 아닌 변수의 저장된 값을 불러옵니다.
MsgBox, % A_Index ; 반복문 횟수를 표현
MsgBox, %A_Index% ; 반복문 횟수를 표현
% 하나와 % % 두개에 대한 자세한 설명은 이후의 [필수] 변수 표현식 에서 설명합니다.
다음으로 If (A_Index = 5)
If (A_Index = 5) 는 보기만해도 대충 짐작이 가시죠?
A_Index 변수의 값이 5가 될때 다음 명령어를 진행합니다.
다음 명령어는 Break 네요,
반복문을 탈출하는 Break는 Loop 괄호밖으로 빠져나갑니다.
Loop 괄호밖에는 '5번 실행하고 나왔네요' 라는 메시지박스가 있네요.
그러므로, 코드의 결과는 위 이미지와 동일합니다.
Break 명령어는 가장 가까운 Loop { } 괄호를 빠져나갑니다.
현재의 { } 괄호를 탈출하는것이죠.
무슨 말인지 다음 코드에서 확인해보세요
Loop
{
Loop
{
MsgBox, 처음실행
break
}
MsgBox, 새끼 루프 탈출
break
}
MsgBox, 외곽 루프 탈출
return
좀 복잡하신가요? ㅎㅎ
실행결과를 보시면 이해가 쉬울거에요
알고리즘을 순서대로 적어보겠습니다.
0. 알트 + X 핫키를 누르면
1. '처음실행' 메시지박스 출력
2. Break 명령어로 현재의 괄호(= 가장 가까운 Loop) 탈출
2. 괄호밖의 '새끼 루프 탈출' 메시지박스 출력
4. 2번째 Break 명령어로 현재의 괄호 (= 가장 가까운 Loop) 탈출
5. 괄호밖의 '외곽 루프 탈출' 메시지박스 출력
6. return 을 만나 종료
그럼 Continue 는 Break 와 다른점이 무엇일까요?
차이점은
Break는 괄호를 탈출시켜서 Loop 반복문을 끝낼수있지만
Continue 는 괄호의 끝으로 가 Loop 반복문을 다시 반복합니다. 즉, 끝나지않습니다.
Continue 예제를 하나 확인하겠습니다
Loop, 10
{
if (A_Index < 5)
continue
MsgBox, % A_Index
} ; Continue 는 바로 여기로 이동
return
코드를 실행해보면,
메시지박스가 5,6,7,8,9,10 을 차례대로 출력됩니다.
A_index, 루프 반복이 5번 미만일때는 Continue 명령어때문에 } 로 이동합니다. 탈출하는것이아닙니다.
그리고 다시 A_Index 값 확인, 5미만이면 } 로 이동, 5이상이면 메시지박스 출력.
루프 횟수를 10으로 설정했으니 이러한 과정을 10번만 거치게됩니다.
Loop / Break / Continue 정리
따라서, 반복문과 반복문 탈출은 아래의 예처럼 합니다.
Loop, 횟수, 생략시 무한반복
{
명령어
break ;반복문 탈출
}
MsgBox, 반복문 탈출했네요
return
6. If / Else / 변수와 표현식
If 와 Else 는 조건식입니다. 위에서 간단한 예시로 확인해봤고 실제로도 쓰임은 전혀 복잡하지 않습니다.
A_Index 라는 변수에 대해서도 잠깐 훑어보았는데,
이 챕터에서 조건식과 ,변수, 그리고 이 모든것을 사용하기위한 표현식에 대해서 자세히 배워보도록 하겠습니다.
MsgBox, % Age
'Age = 20' 이 보이시죠?
주석의 설명대로 Age 라는 변수에 숫자 20을 저장하는겁니다.
오토핫키에서 변수는 자료형(데이터의 타입) 을 명시할 필요가 없습니다.
굉장히 편리하죠 C언어는 변수마다 각각 지정해줘야 하는 번거로움이 있는데 말입니다.
한가지 중요한점. 변수명은 오토핫키의 명령어나 내장변수(A_index 등) 으로 설정하면 안됩니다.
따라서, 변수는 이렇게 지정하는거군요!
Gender = 남자 ; Gender 라는 변수에 '남자' 라는 문자열을 저장
변수1에 변수2의 값을 저장하고 싶다면 어떻게 코드를 작성해야 할까요.
'변수1 = 변수2' 로 하니 '변수1'에는 변수2 라는 문자열이 저장됩니다.
아까 % 표기를 했다는것을 기억하시나요? 여기서도 동일한 문법이 적용됩니다.
Age2 = %Age1% ; Age2 라는 변수에 변수 Age1(숫자20)을 대입
Age3 = Age1 ; Age2 라는 변수에 Age1 이라는 문자 저장
위 변수의 표현식은 트레디셔널 이라고 부릅니다.
표현식엔 종류가 2가지 있는데요. 한가지가 지금 설명한 트레디셔널, 두번째는 익스프레션 입니다.
If 조건식과 앞으로 오토핫키를 깊이있게 사용할 생각이 있으시다면,
가능한 표현식은 익스프레션으로 사용하는것이 좋습니다.
이유는 If 조건식과 대부분의 '~식'들이 익스프레션을 사용하기 때문인데요
그러면 익스프레션을 또 배워야 하나? 머리아픈데..
아닙니다. 트레디셔널과 정말 비슷합니다 간단해요.
Age2 := Age1 ;Age2 에 변수 Age1 을 대입
Gender := "남자" ; Gender라는 변수에 '남자' 문자열 저장
= 대신에 := 을 쓰고, 변수를 대입할 때 % % 표시를 하지않네요.
중요한점은 문자를 저장할때는 " " 따옴표처리를 해야한다는것입니다.
그러면 정리하겠습니다.
결국 (익스프레션) 변수는 이렇게 사용하는군요.
변수명 := "저장할 문자"
변수명 := 대입할 변수명
숫자변수끼리는 서로 값을 연산할수도 있습니다.
변수명 := 변수명1 - 변수명2 ; 뺀 값을 저장
변수명 := 변수명1 * 변수명2 ; 곱한 값을 저장
변수명 := 변수명1 / 변수명2 ; 나눈 값을 저장
문자변수끼리는 문자를 누적이 가능합니다.
Juice := "주스" ; Juice 이라는 변수에 문자 주스 를 저장
이제 그럼 If , Else 와 연관지어 공부해보겠습니다.
Juice := 300
내야할돈 := Apple + Juice ;내야할돈 이라는 변수에 Apple변수와 Juice 변수의 더한값을 저장
가진돈 := 3000
거스름돈 := 가진돈 - 내야할돈 ;거스름돈 이라는 변수에 가진돈 변수에서 내야할돈 변수의 뺸값을 저장
MsgBox, 가진돈보다 비쌈 ; 가진돈보다 비쌈 메시지박스 출력
else if (내야할돈 < 가진돈) ; 만약 내야할돈 변수의 값이 가진돈 변수의 값보다 작다면
MsgBox, 거스름돈 %거스름돈% 원 남습니다 ; 거스름돈 계산한 메시지박스 출력
else ; 그것도 아니라면 (=가진돈과 내야할돈이 같다면)
MsgBox, 거스름돈 0원 남겠네 ; 거스름돈은 0원 남겠군
return
실행결과는 짐작할수 있듯이,
If / Else / 변수와 표현식 정리
변수명2 := "저장할 문자"
조건식이 참일 경우 실행할 명령어 한개
else
조건식이 거짓일 경우 실행할 명령어 한개
return
{ ; 조건식이 참일 경우 괄호의 명령어를 수행함
첫번째 명령어
두번째 명령어
N번째 명령어
}
else ; 조건식이 거짓일 경우 괄호의 명령어를 수행함
{
첫번째 명령어
두번째 명령어
N번째 명령어
}
return
ImageSearch 는 화면에서 이미지를 찾는 명령어입니다. PixelSearch 는 픽셀(점)에서 색상을 찾고요.
이미지서치는 오토핫키에서 가장 핫한 명령어가 아닐까 생각하네요.
[옵션] 으로 분류하기는 했지만 사실상 필수라고 봐도 무방할 정도로 활용도가 높습니다.
이미지서치 사용하기위해서는 당연히 찾을 이미지, 즉 이미지파일이 필요하겠죠?
캡쳐뜨는 프로그램은 여러가지이니 원하는거 사용하시면 되겠습니다.
저의 경우 기본적으로 윈도우에 설치되어있는 그림판 을 사용합니다.
예로서, 이미지서치를 사용해 내 컴퓨터의 로컬 디스크를 클릭하는 코드를 짜보겠습니다.
내 컴퓨터 창을 캡쳐한다음 로컬 디스크 부분은 잘라야겠죠?
사각으로 선택해서~
저 부분만 자르겠습니다.
따라서 이미지는 아래사진과 같겠네요.
그리고 저 이미지파일을 저장합니다, 반드시 영어이름으로 저장합니다.
저는 'MyCom.png' 로 저장하겠습니다. 소스코드와 동일한 경로에 저장해두세요.
이제 코드를 살펴보죠
ImageSearch, vx, vy, 0, 0, A_ScreenWidth, A_ScreenHeight, MyCom.png
if ErrorLevel = 0 ; 만약 이미지를 찾았을 경우에는 괄호의 명령어를 수행
{
Click %vx%, %vy% ; 이미지찾은 위치 X좌표 Y좌표 클릭
MsgBox, 찾음 ; 찾음 메시지박스 출력
}
else if ErrorLevel = 1 ; 만약 이미지를 못찾았을 경우에는
MsgBox, 못찾음 ; 못찾음 메시지박스 출력
return ; 여기까지 수행하고 종료
A키를 누르면 화면에서 소스파일의 경로의 'MyCom.png' 이미지파일을 찾습니다.
그런데 이미지를 찾았는지 못찾았는지 확인을 해야하지않습니까?
그것을 확인할수있는것이 ErrorLevel 내장변수입니다.
이미지파일을 찾았을 경우에는 에러레벨이 0 이 되고, 못찾았을 경우에는 1 이 됩니다.
2로 될때는 이미지파일이 경로에 없어 불러들이지 못하는 경우입니다.
MyCom 이미지파일의 전체경로를 적어야하지만, 이미지가 소스코드파일과 같은 경로에있을경우는
앞 경로를 삭제하고 이미지파일명.확장자 만 적어줘도 무방합니다. 위 코드처럼요.
간략한 설명을 했으니 이제 이미지서치에 대해 자세히 알아보겠습니다.
찾은위치X, Y에는 이미지파일의 X,Y좌표가 저장되는 변수입니다. CoordMode 의 영향을 받습니다.
변수명X, 변수명Y 로 적어줘야합니다. 저장이 필요없다면 그냥 생략하고 , 로 넘길수있습니다.
시작X, Y 에는 이미지파일을 서칭을 시작할 X,Y좌표를 적습니다. CoordMode 의 영향을 받습니다.
지점X, Y 에는 이미지파일을 서칭을 끝낼 X,Y 좌표를 적습니다. CoordMode 의 영향을 받습니다.
시작좌표와 끝 지점좌표를 잘 명시해주면
이미지서치에 걸리는 시간과, 경우에 따라 발생하는 렉을 방지할 수 있습니다만
좌표 구하기가 귀찮기 때문에, 그냥 전체화면에서 찾는게 편합니다.
좌표 (0,0) 부터 (A_ScreenWidth, A_ScreenHeight) 까지가 전체화면입니다.
A_ScreenWidth, A_ScreenHeight 는
앞서말한 A_index 처럼 내장변수 (= 자체적으로 값이 설정되는 변수) 입니다
무엇으로 설정되냐구요?
A_ScreenWidth 는 컴퓨터해상도 X좌표
A_ScreenHeight 는 컴퓨터 해상도 Y좌표 가 되겠습니다.
해상도가 1920, 1080 인 컴퓨터의 경우에 A_ScreenWidth 는 1920, A_ScreenHeight 는 1080이 되겠네요.
작성중입니다.
'프로그래밍 > AHK 메뉴얼' 카테고리의 다른 글
[메뉴얼] GUI창 스킨입히기 (19) | 2015.02.15 |
---|---|
[메뉴얼] 내장파일 설치 가상화 (16) | 2015.02.09 |
[메뉴얼] 오토핫키 소스코드 생성과 컴파일방법 (16) | 2015.02.05 |
DllCall 정리 (10) | 2015.02.04 |
[메뉴얼] 1. 오토핫키 스크립트 생성 (10) | 2015.01.11 |