오토핫키(AutoHotKey) 기초강좌 #3 - 매크로 프로그래밍 1 (Button, Loop, if 사용법)




 전체 강좌

 1강 - 오토핫키(AutoHotKey) 소개

 2강 - 프로그래밍의 시작, GUI 만들기

 3강 - 매크로 프로그래밍 1 (Button, Loop, if 사용법)

 4강 - 매크로 프로그래밍 2 (ImageSearch, Send, Sleep)

 5강 - 매크로 프로그래밍 3 (Gui Submit)

 6강 - 매크로 만들기 응용 1 (if 응용, CoordMode)

 7강 - 매크로 만들기 응용 2 (핫키, if 응용)

 8강 - 매크로 만들기 응용 3 (While, GUI와 변수의 활용 1)

 9강 - 매크로 만들기 응용 4 (GUI와 변수의 활용 2)

 10강 - 매크로 만들기 응용 5 (함수1)

 11강 - 매크로 만들기 응용 6 (함수2)

 12강 - 매크로 제작 예제

















안녕하세요~ 킴영감입니다.


지난시간에는 GUI를 구성하는 코드를 알아봤습니다.


이번시간부터는 매크로를 동작시키는 코드를 작성하도록 할 것입니다.


처음 두 강의에서 조금은 지루한 설명을 드렸는데 프로그래밍이 처음이신 분들은 반드시 완벽히 이해하고 넘어오셔야 합니다. 이해하지 못하신분은 오늘강의 역시 이해가 안될 가능성이 높습니다.


그럼 세번째 강좌를 시작하겠습니다.


우선 SciTE를 실행시켜 지난시간에 작성한 코드를 불러옵니다.


맨 아래에 아래와 같이 코드를 추가합니다.



이렇게 추가 한 부분이 우리가 만들 프로그램의 큰 틀이 됩니다.


특정 버튼을 눌렀을 때 어떠한 작업을 하기 위해서는 "Button + 버튼이름 + :" 으로 시작하며 중괄호({}) 내부에 작업에 관련된 코드를 작성 하시면 됩니다.

또한, GUI, Button시작, Button종료를 각각의 파트라고 하면 각각의 파트사이에 return을 반드시 넣어주셔야 합니다. 첫번째 강좌에서 말씀드렸듯이 작성된 코드는 위에서 아래로 한줄씩 동작하며 동작의 끝을 표시하기위한 것으로 return이 사용됩니다. (return은 주로 프로그램이 끝나는 지점에 사용되지만 지금 수준에서는 똑같이 따라하시면 됩니다.)


여기까지 작성한 코드의 동작순서를 알려드리면

프로그램 실행 시 - 2~9 줄 (GUI를 보여줍니다.)

시작버튼을 누를 시 - 11~15 줄 (Button시작: 내부에 있는 코드를 실행합니다.)

종료버튼을 누를 시 - 17~20 줄 (Button종료: 내부에 있는 코드를 실행합니다.)    

여기서 내부는 중괄호 안에 작성 할 코드를 의미합니다.


이제 무한반복을 의미하는 루프를 만들어보겠습니다.

아래와 같이 코드를 추가합니다.



루프의 사용법은 아래와 같습니다.


Loop, 반복횟수

{

  반복할 작업의 코드

} 

 또는 

Loop

{

  반복할 작업의 코드

}


앞에 적힌 방법의 경우 특정 반복횟수만큼만 반복작업을 할 때 "Loop," 뒤에 반복횟수를 숫자로 적어주는 것이고

뒤에 적힌 방법의 경우 무한반복을 할 때 사용하시면 됩니다.

우리는 무한반복을 목적으로 하기에 뒤에 적힌 방법을 사용했습니다.

이해가 어려우신 분은 루프는 단순히 중괄호 내부의 코드를 반복해서 수행하는 명령어라고 생각하시면 됩니다.



그럼 여기서 들어야 하는 의문이 있습니다. "프로그램을 멈출때는 어떻게 하지?" 라는 의문입니다.

정답은 많습니다. 실제 코드를 작성하는 사람마다 다르게 작성할 수 있으며 제가 제시하는 방법이 가장 보편적으로 많이 쓰이는 방법입니다.


9번째 줄에 "매크로시작 := false" 라고 적힌 부분이 핵심입니다.

이 부분은 "매크로시작"이라는 변수에 "false"라는 값을 저장한다는 의미를 가집니다. 이처럼 어떠한 변수에 값을 저장할 때에는 ":="라는 기호를 사용합니다. 그리고 이 코드의 위치가 첫번째 return 위에 있기 때문에 프로그램을 실행 했을 때 변수가 만들어지게되고 프로그램을 종료할 때까지 사용할 수 있습니다.


이렇게 선언된 변수를 어떻게 사용하는지 살펴보겠습니다.

15번째 줄을 보시면 "매크로시작 := true" 라고 작성되어 있습니다. 시작버튼을 누르면 "Button시작:" 내부에 있는 코드를 실행하게 되고 매크로가 시작되었다는 상태를 "매크로시작"이라는 변수에 저장하는 것입니다. 이후, Loop내부에 있는 코드를 무한반복해서 실행하게 됩니다.


이와 마찬가지로 "Button종료:" 내부에 "매크로시작 := false"라는 코드를 추가함으로써 매크로가 종료되었다는 상태를 저장합니다.


하지만, 종료버튼이 눌러졌을 때에도 시작버튼의 내부에 있는 작업은 계속되고 있으며 이를 멈추기 위한 코드가 필요합니다. 종료버튼을 눌렀을 때 시작버튼의 루프를 멈추도록 하는 것이 "탈출문"이라고 하며 19~22번 줄이 탈출문을 의미합니다.


19~22번의 코드를 살펴봅시다. 처음보는 if 라는 코드가 보이시죠? if는 특정 조건을 만족할 경우 중괄호 내부에 코드를 수행하도록 합니다. 사용방법은 아래와 같습니다.


if (특정 조건)

{

  특정한 조건을 만족할 경우 실행할 코드

}


우리는 특정 조건"매크로시작"이라는 변수가 "false"값을 가질때로 코드를 작성한 것입니다. 조건을 쉽게 풀이하면 "'매크로시작'이라는 변수가 가지고 있는 값이 'false'와 같은가?" 입니다. 이처럼 왼쪽과 오른쪽의 값이 같은지 비교할 때에는 "="을 사용하시면 됩니다. (":="과 혼동하시면 안됩니다.)


종료버튼을 누를경우 "매크로시작"은 "false" 값을 가지게 되고 "if"에 표시된 조건을 만족하게 됩니다. 

"if" 내부에 있는 "break"는 루프를 강제로 탈출하라는 명령어 입니다. (루프 내부의 탈출조건이 있는곳에 적어주시면 됩니다.)


시작버튼을 눌러 루프내부의 내용을 무한반복하고 있을 때 종료버튼을 누름으로써 루프를 탈출하는 과정까지 설명드렸습니다. 


마지막으로 "Button종료:" 내부에 있는 "ExitApp"라는 명령어는 오토핫키 프로그램을 종료시키는 명령어 입니다.


이것으로 우리가 함께 작성할 프로그램의 큰 뼈대를 완성했습니다.



프로그래밍이 처음이신분은 한번보셔서는 이해하시기 어려울 것입니다. 글을 천천히 이해가 될때까지 읽어보셔야 됨을 다시한번 강조하고 싶습니다.


초보를 대상으로 하는 강좌인 만큼 앞으로도 천천히 따라하면 프로그램이 완성되도록 강좌를 진행할 예정입니다. 하지만 아주 기초적인 내용만 다루기 때문에 원하는 기능들을 추가하시기 위해서는 블로의 내용을 모두 이해하셔야 응용을 하실 수 있습니다.


세번째 강좌를 마치겠습니다.



블로그 이미지

킴영감

프로그래밍과 게임공략, 게임과 관련된 프로그램에 대한 내용을 다룹니다.

댓글을 달아 주세요

  • false와 true부분 2015.08.03 21:33  댓글주소  수정/삭제  댓글쓰기

    몇번을 다시 읽어도 이해가 안가네요
    매크로시작 := 은 무엇이고
    button시작: 은 뭔가요?
    제가 이해한대로면
    시작 버튼을 누름 ㅡ> button시작 으로 가짐 ㅡ> loop를 탐
    근데 여기서 false는 뭘 뜻하고 뭘 저장한단거죠?

    • 킴영감 2015.08.03 21:48 신고  댓글주소  수정/삭제

      변수의 개념을 설명을 안드려서 그런 것 같네요. 우선 "매크로시작" 은 변수입니다. 변수란 수학에서 배운 방정식의 x와 같은 역할이라고 생각하시면 쉬울 것 같습니다. x에 true 또는 false라는 값을 넣어놓고 필요할때 사용하는 것이죠. (true는 1, false는 0입니다) 기호의 경우 ":" 또는 "::"는 버튼이나 단축키를 만들때 사용하는 것이고 ":="는 기호 왼쪽에 있는 변수에 기호 오른쪽에 있는 값을 넣을때 사용하는 것입니다.
      프로그램 처음 입문하시는 분이면 우선 따라만 해보시고 구글에서 "오토핫키 변수" 라고 검색하셔서 변수에 대한 개념을 이해하시는게 도움이 될것같습니다.

  • 네오 2015.08.22 14:22  댓글주소  수정/삭제  댓글쓰기

    그 Gui, Add, Text, x30 y5 h2, 매크로 프로그램 ; 프로그램 제목 표시
    Gui, Add, Text, x60 y25 w50 h20 vA, 준비!!!
    Gui, Add, Text x60 y50 h20 w50 vB. 0 회
    Gui, Add, Button, x20 y80 w110 h20, 시작
    Gui, Add, Button, x20 y110 w110 h20, 종료
    Gui, Show
    이거 다입력하고 밑에 뭐있길래 다지웟는데 버튼시작하고 묶여있는건 어떻게 만드나요

  • 아직초보 2015.09.10 17:45  댓글주소  수정/삭제  댓글쓰기

    버튼 이용할떄 창조절을할려고 하는대
    F1::
    inmove, 프로그램명, , 0, 0 으로하면 조정이되는데
    botton버튼이름:
    winmove, 프로그램명, , 0, 0 으로하면 반응이없습니다. 뭐가 문제인가요

  • 아직초보 2015.09.10 20:02  댓글주소  수정/삭제  댓글쓰기

    윈도우창 위치를 조정하려는데

    F10::
    winmove, MapleStory, , 0, 0
    msgbox,64 ,창위치 조정
    위와같이하면 F10 누르면 창위치가 조정되거든요
    그런데 아래와같이
    botton버튼명:
    winmove, MapleStory, , 0, 0
    msgbox,64 ,창위치 조정
    이렇게하면 버튼을 눌러도 아무 반응이 없습니다 ;;ㅠ
    스크립트 작성하고 F5 누르면 오류는 안나는데
    왜이런거죠 도와주세요 급합니다 ㅠㅠ

    • 킴영감 2015.09.10 21:40 신고  댓글주소  수정/삭제

      스크립트를 작성할 때 강좌와 동일한 형태로 작성하시는 습관을 들이시길 권장합니다.

      질문에 대한 답변을 드리면 중괄호와 return이 반드시 들어가야 하며
      botton버튼명:
      {
      winmove, MapleStory, , 0, 0
      msgbox,64 ,창위치 조정
      }
      return

      이렇게 수정하시면 됩니다.^^

  • 0000 2016.01.12 08:55  댓글주소  수정/삭제  댓글쓰기

    >"C:\Program Files\Autohotkey\Autohotkey.exe" /ErrorStdOut "C:\Users\sec\Desktop\TestSuite.ahk"
    C:\Users\sec\Desktop\Testsuite.ahk (48) : ==> Break/Continue must be enclosed by a Loop
    >Exit code: 2 Time: 0.04456

    이렇게 되는데 어떻게 해야 하나요?
    (48)이
    if(매크로시작 = false)
    {
    break
    }

    여기서 break 부분인데

    • 킴영감 2016.01.15 15:24 신고  댓글주소  수정/삭제

      loop가 없는데 break를 쓰셔서 에러가 난 것입니다.
      break는 루프를 탈출할 때에만 쓰는 것입니다.
      Loop 또는 While을 쓰지 않으셨다면 break를 지우셔야 합니다.
      프로그래밍을 처음 접하시는 것이라면 강좌를 똑같이 따라해보면서 확실하게 이해하신 후에 본인에게 맞게 수정하시면서 공부하시면 좋을 것 같습니다.^^

  • 저기 2016.01.16 12:13  댓글주소  수정/삭제  댓글쓰기

    저 한국말이 명령어에요?
    한국말 때문에 더 헷깔리는데...........
    한국말도 입력해야 명령이 입력되는 건가요?
    제가 알기로는 전부 영어인걸로 알고 있었는데 잘못 알고 있었나요??

    • 킴영감 2016.01.16 14:00 신고  댓글주소  수정/삭제

      한글로 되어있는것은 변수입니다. 변수의 개념은 뒤에서 설명하니까 우선 어떤 값을 저장하는 것이라고만 알고 넘어가시면 될 것 같습니다^^

  • 홍또띠 2016.08.04 01:13  댓글주소  수정/삭제  댓글쓰기

    영감님 감사합니다 제가 멍청한 편인데 이해가 잘가네요

  • 2017.03.19 20:19  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • 정영감 2018.01.15 15:03  댓글주소  수정/삭제  댓글쓰기

    저 위에 ture 되어있는거 true 인가요

  • 프리스케이터 2018.10.11 10:23  댓글주소  수정/삭제  댓글쓰기

    Gui, Add, Text, x30 y5 w110 h20, 매크로프로그램
    Gui, Add, Text, x60 y25 w50 h20 vA, 준비!!!
    Gui, Add, Text, x60 y50 w50 h20, 0회
    Gui, Add, Button, x20 y80 w110 h20, 시작
    Gui, Add, Button, x20 y110 w110 h20, 종료
    Gui, Show

    매크로시작 := false
    return
    Button시작:
    {
    매크로시작 := true
    Loop{
    ;여기에 무한 반복할 작업의 코드를 작성합니다.
    if(매크로시작 = false)
    {
    break
    }
    }
    }
    return

    Button종료:
    {
    매크로시작 := false
    ExitApp
    }
    return

  • 슬픈휘파람 2019.02.07 17:59  댓글주소  수정/삭제  댓글쓰기

    ㅠㅠ 또 한가지 난관에 봉착했습니다.
    특정이미지를 찾았을 경우 특정 좌표를 클릭하게 하기 위해 loop 를 썼더니
    계속 클릭하고 있네요 ...
    이 경우 클릭하고 나서 멈추게 하는 부분이 break 아닌가요?

    이하 현제 소스 코드입니다.

    gui, add, text, x10 y10 w150 h20 Center, 매크로 프로그램
    gui, add, button, x10 y30 w150 h20, 시작
    gui, add, button, x10 y55 w150 h20, 종료
    gui, show, , 매크로프로그램
    return

    GuiClose:
    {
    ExitApp
    }
    return

    Button시작:
    {
    MsgBox, 프로그램이 시작됩니다

    매크로시작 := true
    Loop
    {
    ;여기에 무한 반복할 작업의 코드를 작성합니다
    ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\img\0.bmp
    if (ErrorLevel = 0)


    {
    x좌표 := 601
    y좌표 := 357
    Click, %X좌표%, %y좌표%
    Sleep, 1000
    Click, %X좌표%, %y좌표%
    }

    if (매크로시작 = false)
    {
    break
    }
    }
    }
    return

    Button종료:
    {
    매크로시작 := false
    ExitApp
    }
    return

  • 세월잡는태공 2019.02.21 17:37  댓글주소  수정/삭제  댓글쓰기

    킴영감님 덕분에 열심히 배우려는 독자인데요...autohot에디터를 열고 영어는 정상적으로 입력되는데 한글은 깨지는건 아닌데 자판이 맘대로 써지는건...ㄱ을 쓰면 지 맘대로 뱦ㅇ 이런식으로 써지네요 왜그럴까요 ㅜㅜ 자판 설정하는게 있는건지 알려주세요

  • 응가맨 2019.03.22 02:01  댓글주소  수정/삭제  댓글쓰기

    gui, add, Text, x30 y5 w110 h20, 메크로 첫시작
    gui, add, text, x20 y25 h20 vA, 준비
    gui, add, text, x20 y50 h20 vB, 0회
    gui, add, button, x30 y75 w60 h25, 시작
    gui, add, button, x30 y100 w60 h25, 끝
    gui, show

    매시 := false

    return

    button시작:
    {
    매시 := ture
    Loop,
    {
    send, dkakskdkaksk
    if(매시 = false)
    {
    break
    }
    }
    }
    return

    button끝:
    {
    매시 := false
    Exitapp
    }
    return

    이렇게했는데... 아무리 어떻게해도 button끝을 눌러도 계속 loop를 반복하네요
    if 조건문 때문에 button끝 을 누름으로써 break 로 loop를 탈출한다고 배웠는데 적요이 안돼요 ...