2019년 1월 28일 월요일

[매크로] 오토핫키 기초

 제가 매크로에 관심을 가지게 된 계기는 리니지m이 출시될 쯤 입니다. 리니지m 특성상 사냥하는 곳에서 서로를 죽일 수 있었기 때문에 죽지 않기 위해 매크로를 이용하는 유저들이 많았습니다. 매크로를 이용하는 유저들을 막기위해 엔씨소프트는 불법 프로그램을 이용한 유저들에게 경고를 주거나 영구정지를 했었습니다. 이와 같은 상황에서 저는 유저들이 왜 매크로를 이용하는지 어떤 구조로 작동하는지를 이해하고 싶었고 매크로에 입문하게 되었습니다.

 매크로를 만들기 전 매크로를 만드는 이유를 명확히해야 합니다. 대부분 매크로를 제작하는 이유는 반복 작업을 컴퓨터가 대신하길 원하는 것입니다. 게임을 예로들면 '내가 직접 플레이하지 않아도 레벨업을 하고 싶다'가 이유가 됩니다. 아니면 '내가 직접 플레이하지 않아도 게임재화를 많이 벌고 싶다'가 될껍니다. 만드는 이유를 명확히해야 매크로를 만들 때 우왕좌왕하지 않을 뿐만 아니라 매크로를 제작하는데 시간이 오래 걸리지만 제작해서 얻는 이점을 생각하여 중간에 포기하지 않을 것입니다.

 매크로 프로그램 중 오토핫키를 이용하는 이유는 구글 검색시 스트립트를 직접 작성하여 만들 수 있는 매크로 프로그램이었기 때문입니다. 저는 R 프로그램을 많이 다뤄봐서 그런지 오토핫키 명령문에 적응한 뒤로는 많이 어렵지 않았습니다. 혹시 R 프로그램 부터 배우다가 장벽을 느끼신 분들을 오토핫키로 프로그램에 대한 흥미를 느끼시고 다시 돌아가시는게 좋다고 생각합니다.

 지금부터 알려드리는 오토핫키 명령문은 매크로를 만드는데 아주 기초적인 것들 입니다. 몇 개 안되지만 이 정도만 알아도 원하는 매크로를 만들 수 있습니다.

1. 매크로 시작과 종료
0::

Msgbox,ok

9::ExitApp
 매크로를 처음 만들 때 시작과 종료 키를 만들지 않으면 매크로를 시작을 했을 때 종료를 할 수 없는 난감한 상황이 발생합니다. 다른 코드를 적을 때도 위 코드를 이용하겠습니다. 0::은 키보드 숫자 0을 누르면 매크로가 시작되게 합니다. 맨 앞에 넣어야하며 0대신 자신이 하고 싶은 키를 넣으셔도 상관없습니다. 9::ExitApp은 키보드 숫자 9를 누르면 매크로가 종료되게 합니다. 맨 끝에 넣어야하며 9 대신 다른 키를 넣어도 됩니다.

 Msgbox,ok는 매크로가 시작되면 ok를 출력합니다. ok 대신 다른 문장을 넣어도 됩니다.


작성한 코드를 실행하려면 아래의 빨간색 단축키를 누르면 됩니다.


스크립트가 저장 안되어 있다면 저장 창이 뜹니다.


바탕화면에 오토핫키 폴더를 하나 생성합니다.


오토핫키 폴더에 스크립트를 example로 저장합니다.


저장이 완료되면 편집기 아래 그림과 같은 빨간색 부분이 생깁니다.


0을 누르면 매크로가 시작되어 ok라는 MsgBox가 생깁니다. 확인을 누르기 전까지 다음 코드로 넘어가지 않습니다.


Msgbox의 확인을 누르면 코드가 모드 실행되어 매크로가 종료됩니다. 편집기 아래 창에 종료 메시지와 매크로 실행시간이 출력됩니다.


2. MouseClick
영어 그대로 마우스 클릭입니다.
0::

MouseClick,,x좌표,y좌표,클릭횟수

9::ExitApp
 내가 누르고 싶은 x좌표와 y좌표를 입력하면 됩니다. x좌표와 y좌표는 SciTE4AutoHotkey 도구 단축키에 있는 Active Window Info를 누르면 확인할 수 있습니다.



 Mouse Position 부분을 보시면 Absolute, Relative, Client 3가지 항목이 있습니다. Absolute는 윈도우 화면 전체에서의 좌표를 나타내고, Relative는 선택한 창에서의 좌표, Client는 선택한 창에서 내부 화면 영역의 좌표를 의미합니다. 대부분 창 안에서 클릭하므로 Relative를 주로 씁니다. 내가 클릭하고 싶은 위치에 마우스 커서를 올렸을 때 Relative에 적힌 좌표값을 위의 코드에 적으면 됩니다.(좌표는 왼쪽 위가 시작점이므로 0,0입니다.)


3. MouseClickDrag
 마우스 드래그도 가능합니다.
0::

MouseClickDrag,right or left(마우스키를 의미),처음 x좌표,처음 y좌표,마지막 x좌표,마지막 y좌표,드래그 속도(0~100)

9::ExitApp
 right or left 부분에서 마우스 오른쪽 키를 누르고 드래그 하도록 할지 왼쪽 키를 누르고 드래그 하도록 할지 정할 수 있습니다. 다음으로 마우스를 드래그 할 때 처음에 누르는 위치와 드래그가 끝나는 마지막 좌표를 입력해야 합니다. 마지막으로 드래그의 속도를 1~100 중에서 정해주면 됩니다.

4. Send
0::

Send,입력하고 싶은 문자

9::ExitApp
 매크로를 이용하여 글씨를 입력하고 싶을 때 Send를 이용합니다. 커서가 있는 위치에 Send, 다음에 입력한 문자 그대로가 입력됩니다. Send 코드 전에 커서 위치를 누르는 MouseClick 코드를 추가하는게 좋습니다.

5. Sleep
0::

Sleep,숫자

9::ExitApp
 Sleep은 얼마정도 간격을 두고 코드를 실행하고 싶을 때 이용하는 명령문 입니다. 1000이 1초를 의미하기 때문에 숫자가 5000이면 5초 뒤에 다음 코드로 넘어 간다는 의미입니다.

6. 특정 문자에 값을 저장
0::

A:=1

9::ExitApp
 :=을 이용하여 특정 문자에 값을 저장할 수 있습니다. 위 코드는 A에 1을 저장한다는 의미입니다.

0::

A:="안녕"

9::ExitApp
 문자를 저장하고 싶을 때는 ""를 써야 합니다.


0::

A:="안녕"
B:=A

9::ExitApp
 A에 저장되어 있는 값을 B라는 문자에 저장하고 싶을 때 :=를 이용하면 됩니다.

0::

A:="안녕"
MsgBox,%A%

9::ExitApp
 A에 저장되어 있는 값을 MsgBox로 출력하려면 %%를 써야 합니다. 적지 않으면 A가 출력됩니다.

7. loop
0::

loop,반복횟수
{

  break

}

9::ExitApp
 반복을 하고 싶을 때는 loop를 이용하면 됩니다. loop 다음에 있는 { } 안에 코드를 넣어야 반복합니다. loop 다음에 ,반복횟수를 적어주면 반복횟수 만큼 반복합니다. ,반복횟수를 적지 않으면 loop 문을 계속 반복하게 됩니다. loop를 멈추고 싶을 경우 break를 넣어주시면 break를 만나는 순간 loop 문이 종료됩니다.

8. if
0::

if(조건1)
{

}
else if(조건2)
{

}
else
{

}

9::ExitApp
 조건문을 넣고 싶을 때는 if를 이용하면 됩니다. 조건1을 만족하면 조건1 { } 안에 있는 코드를 실행하고 조건1이 만족하지 않으면 조건2가 맞는지 확인합니다. 조건2가 만족한다면 조건2 { } 안에 있는 코드를 실행하고 조건2가 만족하지 않으면 else { } 안에 있는 코드를 실행하게 됩니다.

쉽게 설명하면 위와 같지만 자세히 설명하자면 조건1 부분이 참(True)일 경우 { } 안에 있는 코드가 실행됩니다. 그렇다면 조건을 어떻게 만드는지 알아야합니다. 보통 2개의 값을 비교할 때는 아래와 같은 연산자를 이용하시면 됩니다.

(x > y)   ;x가 y보다 큰가?

(x < y)   ;x가 y보다 작은가?

(x = y)   ;x와 y가 같은가?

(x != y)   ;x와 y가 같지 않은가?

(x <> y)   ;x와 y가 다른가?

(x >= y)   ;x가 y보다 크거나 같은가?

(x <= y)   ;x가 y보다 작거나 같은가?
조건을 여러개 중첩하고 싶을 때는 AND(&&)와 OR(||)를 이용합니다. |는 키보드의 Back space 옆에 있는 \와 shift로 적을 수 있습니다.(\+shift)

(x > 0 AND x < 10)   ;x010 사이인가?

(x > 0 && x < 10)   ;x010 사이인가?

(x = 1 OR x = 2)   ;x1 아니면 2인가?

(x = 1 || x = 2)   ;x1 아니면 2인가?
9. ImageSearch
0::

ImageSearch,캡처를 찾았을 경우 x좌표,캡처를 찾았을 경우 y좌표,0,0,A_ScreenWidth,A_ScreenHeight,*이미지정확도값 캡처.png

IF ErrorLevel=0
{

}

IF ErrorLevel=1
{

}

9::ExitApp

 내가 캡처해둔 그림과 똑같은 이미지를 찾고 싶을 때 ImageSearch 함수를 이용해야 합니다.(캡처는 보조프로그램에 있는 '캡처 도구'를 이용하면 됩니다) 이미지를 찾았다면 '캡처를 찾았을 경우 x좌표'와 '캡처를 찾았을 경우 y좌표'에 이미지 위치가 저장됩니다.

 0,0,A_ScreenWidth,A_ScreenHeight는 이미지를 전체 화면에서 찾는다는 의미입니다. 0,0 부분에 100,100을 넣는다면 x좌표가 100이고 y좌표가 100인 부분부터 찾게 됩니다. A_ScreenWidth,A_ScreenHeight은 화면의 최대폭과 최대 높이를 의미하는데 이부분에 다른 값을 넣는다면 해당 위치까지 이미지를 찾게 됩니다. 대부분 전체 화면에서 찾기 때문에 그대로 이용해도 상관없습니다.

 '*이미지 허용값'은 캡처 이미지와 완벽하게 같은 이미지를 찾을 수 없기 때문에 어느 정도의 허용값을 준다고 이해하시면 됩니다. 저는 보통 50~100의 값을 이용하며 값이 작을 수록 캡처와 거의 같은 이미지를 찾게되고 값이 클수록 캡처와 약간 다른 이미지를 찾을 수 있게 됩니다. 자신이 찾고 싶은 이미지가 잘 찾아질 때까지 값을 변경해봐야 합니다.

 다음으로 캡처.png와 같이 쓰고 싶다면 스크립트가 저장된 위치에 캡처.png 파일이 있어야 합니다. 스트립트가 바탕화면 오토핫키 폴더에 있으므로 같은 곳에 넣습니다. 캡처.png 파일이 스크립트가 저장된 위치가 아니라 다른 곳에 있다면 모든 경로를 다 적어야합니다. 예를 들어 C:\Users\user\Desktop\캡처.png 같이 적어야합니다. 되도록이면 폴더를 하나 만들어서 스크립트와 이미지를 같이 저장해두는게 좋습니다.

 마지막으로 IF ErrorLevel=0 { }은 그림을 찾았을 경우 { } 안에 있는 코드를 실행하고 IF ErrorLevel=1 { }은 그림을 찾지 못했을 경우 { } 안에 있는 코드를 실행합니다.

 매크로를 실행했을 때 이미지를 찾지 못한다면 찾으려는 화면에 커서를 두고 실행했는지 확인하시길 바랍니다. 그래도 안된다면 허용값을 더 크게 해보시기 바랍니다.

※ 주의할 점

(1) 캡처한 이미지 확장자 명이 jpg면 작동하지 않습니다. png나 bmp 파일로 저장하는게 좋습니다. 

(2) 이미지는 가능한 작게 특징이 잡히도록 캡처해야 합니다. 캡처하려는 이미지의 배경이 바뀌는 경우 배경를 제외해서 캡처해야합니다.
크롬 아이콘을 예를 들어 설명하면 배경까지 캡처하는 것 보다 가운데의 특징적인 부분만 캡처하는 것이 좋습니다.

(X)
 (O)

(3) 캡처한 이미지의 사이즈를 바꾸면 안됩니다. 예를 들어 앱플레이어의 사이즈가 바뀌면 기존에 캡처한 이미지를 못찾을 수도 있습니다.

10. WinActivate
0::

IfWinExist,ahk_exe notepad.exe
{
  WinActivate,제목 없음 - 메모장
  {

  }
}

9::ExitApp
 메모장을 예를 들어서 설명하겠습니다. 메모장에 커서를 두고 Active Window Info를 확인하면 Window Title, Class and Process 부분에 메모장의 이름, 메모장의 클래스 이름, 메모장의 프로세스 이름으로 구성되어 있는 것을 확인할 수 있습니다.


 ifWinExist,프로세스는 프로세스가 실행되어 있다면 { }안의 코드를 실행하는 함수 입니다.
ifWinExist, 뒤에 Active Window Info에 나와있는 메모장의 프로세스(ahk_exe notepad.exe)를 적어주면 메모장이 실행되어 있는지 확인합니다.

 WinActivate,프로그램명은 프로그램명과 같은 프로그램 창을 맨위로 올려줍니다. 최소화 되어있더라도 프로그램 창을 띄워줍니다.

 요약하자면 ifWinExist 함수로 프로그램이 실행되어 있는지 확인하고 WinActivate으로 프로그램을 활성화한 뒤 코드를 실행하도록 구성하면 됩니다.


 지금까지의 코드를 이용해서 제작해보고 싶은 매크로를 직접 만들어보며 연습해보시길 바랍니다.


※ 참고문헌
https://elderlykims.tistory.com/ 킴영감 이야기
https://secretgd.tistory.com
http://autohotkey.kro.kr/
http://urin79.com/blog/534396

댓글 1개: