오토핫키(AutoHotKey) 기초강좌 #7 - 매크로 만들기 응용 2 (핫키, 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강 - 매크로 제작 예제

















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


지난 강좌까지 열심히 달려오면서 조금이라도 재미를 느끼셨나요?


공부할 때는 힘들지만 내가 작성하는데로 동작하는 프로그램을 보고 있으면 흐뭇한 미소를 짓게 됩니다.^^


그럼 오늘도 열심히 한번 달려보겠습니다.


1. 핫키


"핫키"라는 단어가 생소하신분은 "단축키"라고 생각하시면 됩니다.


그럼 단축키를 만드는 방법과 우리는 어떻게 사용하면 좋은지에 대해 얘기해 보도록 하겠습니다.


핫키 사용방법은 아래와 같습니다.


 단축키:: 

 {

   단축키를 눌렀을 때 동작시킬 내용

 }

 return 


단축키 부분에 사용할 키보드 키를 입력하시면 됩니다. 여러 키의 조합을 사용할 수도 있지만 오늘은 "F2"키를 사용하도록 하겠습니다.

오토핫키에서 핫키를 사용할 때의 장점을 윈도우에서 사용하고 있는 단축키를 별도의 설정없이 내가 원하는대로 사용할 수 있다는 점입니다.


그럼 바로 프로그래밍에 들어가 봅시다.


지난시간까지는 버튼을 이용해서 시작과 종료를 했습니다. 여기에 추가로 멈춤 기능을 핫키로 구현해 보도록 하겠습니다.


아래와 같이 스크립트를 작성하세요.



단축키 부분에 "F2"를 적었습니다. 그리고 3강에서 배웠던 Loop를 탈출하는 방법으로 사용했던 "매크로시작"변수에 false 값을 넣었습니다. 

시작버튼을 눌러 프로그램이 루프를 돌고 있을 때 F2를 누르게되면 시작버튼에 있는 코드는 계속 실행되고 동시에 F2의 중괄호 내부의 코드가 실행되는 것이며, 매크로시작변수에 false가 들어가고 루프의 탈출 조건을 만족하기 때문에 루프를 탈출하는 것입니다. (이해가 안되시는 분은 3강을 다시 보시기 바랍니다.)

그리고 프로그램의 상태를 나타내는 텍스트에 "멈춤"이라고 표시해줍니다.


간단하게 멈춤 기능을 구현했습니다. 


스크립트를 실행해서 테스트 해 보시면 멈춤을 눌러도 바로 멈추지 않는 것을 확인 할 수 있습니다. 이는 루프 탈출을 위한 if가 제일 아래에 위치하고 있기 때문에 위에 있는 코드를 모두 실행한 뒤 탈출 하는 것입니다.


그럼 멈춤이나 F2키를 눌렀을 때 바로 멈추는 방법이 있을까요??


"즉시"는 아니지만 마우스 클릭은 안하게 스크립트를 수정해봅시다.



2. if 응용 (두번째)


우선 아래와 같이 스크립트를 수정합니다.



빨간 박스로 표시한 부분이 수정한 부분입니다.


if의 조건이 조금 바뀐것을 볼 수 있습니다. if의 조건으로 "ErrorLevel = 0"과 "매크로시작 = true" 두가지를 사용한 것입니다. 이처럼 여러개의 조건을 한번에 사용할 수 있으며 사용 방법은 아래와 같습니다.


 if ((조건1) && (조건2) && (조건3).....)


이처럼 여러가지의 조건을 나열해서 사용할 수 있습니다. 그런데 "&&"는 뭘까요?? 

"and 연산"을 아시는 분은 하실테지만 기초강좌인 만큼 모르시는 분을 위해 설명드리겠습니다.

"&&"의 의미는 양 옆에 있는 두개의 조건을 모두 만족해야 한다는 뜻입니다. 작성한 코드를 보면 "ErrorLevel = 0"과 "매크로시작 = true" 두가지 조건을 모두 만족해야지만 중괄호 내부의 코드를 실행하게 됩니다.

참고사항으로 "&&"의 자리에 "||"를 넣게 되면 둘 중 하나라도 만족하면 중괄호 내부의 코드를 실행하게 됩니다.


쉽게 생각하면 쉽고 어렵게 생각하면 어렵습니다. 프로그래밍을 공부하는데 가장 좋은 방법은 실습이니 반드시 직접 수정해보고 실행시켜가며 공부하기 바랍니다.


이제 멈춤이나 종료를 눌렀을 때 바로 반응하도록 코드가 변경되었습니다. 



오늘도 열심히 달렸네요.


점점 그럴듯한 매크로가 만들어지고 있는 것이 보이시죠??


화면이 화려한 것이 좋은 매크로는 아닙니다. 직접 작성하면 원하는 설정들은 코드로 직접 작성 할 수 있기 때문에 훨씬 수월하게 매크로를 만들 수 있습니다. 그러니 힘내서 따라오시기 바랍니다.


이상으로 강좌를 마치겠습니다.



블로그 이미지

킴영감

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

댓글을 달아 주세요

  • 와리가리 2015.07.24 13:57  댓글주소  수정/삭제  댓글쓰기

    즐겨찾기하고 매일 잘 보고 있습니다.^^그런데 활성화된 창을 선택해야하는데...

    제가 블루스택을 이용하거든요~
    (질문1)
    CoordMode, pixel, Screen
    여기서 screen에 블루스택이름을 써주면 되나요?
    (질문2)
    아 그리고
    CoordMode, Mouse, Screen
    mouse도 같이 총 2줄을써주면 되는건가요?
    (질문3)
    전 이미지서치로 만들고 싶은데 pixel 자리에 Imagesearch로 바꿔주면 되는건가요?

    정지버튼 안그래도 여쭤보려고 했는데 마침 강의에 나와서 +_+ 감사합니다.

    • 킴영감 2015.07.24 18:37 신고  댓글주소  수정/삭제

      안녕하세요~ 잘 보고 계신다니 뿌듯하네요~^^
      질문에 답변 드릴게요~

      질문해주신 부분 모두 수정없이 예제코드 그대로 사용하시면 됩니다.
      CoordMode 는 두번째 항에 적힌 기능을 수행할 좌표를 설정해 주는 것이며 Screen은 전체화면을, Window는 활성화 된 창을 의미합니다. 특정 프로그램을 타겟으로 하는 것이 아니기 때문에 어디에서든 화면만 보이면 되는 것입니다.

      CoordMode, Pixel의 경우는 픽셀서치와 이미지서치 둘다에 적용되기 때문에 따로 해줄 필요가 없습니다.

      질문에 답변이 되었는지 모르겠네요...^^ 또 궁금하신부분 있으시면 언제든지 댓글 달아주세요~

  • 와리가리 2015.07.25 11:20  댓글주소  수정/삭제  댓글쓰기

    덧글 감사합니다.^^

  • 와리가리 2015.07.25 11:27  댓글주소  수정/삭제  댓글쓰기

    방금 테스트 했는데 다 잘되긴하는데요~
    궁금한게...매크로를 실행했을때 다른 작업은 할 수 없는건가요?
    매크로는 매크로대로 알아서 돌아가고 저는 다른 작업을 하고 싶은데 마우스가 자꾸
    자동으로 움직여서요^^;

    • 킴영감 2015.07.25 11:32 신고  댓글주소  수정/삭제

      지금까지의 내용으로는 할 수 없습니다.
      기초강좌이기 때문에 쉬운 방법인 Send를 써서 마우스를 조작하도록 했기 때문이에요^^
      기초강좌가 끝나면 비활성 관련 함수를 다룰 것이기 때문에 꾸준히 강좌를 보시면서 따라오시면 될 것 같습니다.^^
      마우스가 안움직이게 하는 건 초보분들 한테는 많이 어려워요...ㅠㅠ

  • 와리가리 2015.07.25 20:18  댓글주소  수정/삭제  댓글쓰기

    덧글 감사합니다.^^ 주말 잘보내세요^^
    빨리 블루스택으로 매크로 돌려보고 싶어요~!

  • 신정용 2015.10.05 00:31  댓글주소  수정/삭제  댓글쓰기

    저 하나 궁금한거 좀 여쭤보고싶은데 무엇으로연락되나요.. 혹시 카톡이나 그런걸로 좀 여쭤봐도 될가요 아이디좀 여쭤봐도될가요

    제가 궁금한건
    마우스 휠 다운을 무한하는데 그 하는도중에 이미지서치가일치하면 그작업을하고
    휠 다운을 30번정도 했는데 하는동안 일치하지않으면 백스페이스를 누른다... 이런거 하려고합니다
    명령어를 어떻게 줘야할가요

    • 킴영감 2015.10.05 10:13 신고  댓글주소  수정/삭제

      질문은 댓글을 통해서만 받습니다^^

      음...우선 질문에 대한 답변을 드리면 마우스 휠 다운의 경우 Send, {WheelDown}을 사용하시면 됩니다. 이미지가 없을 때 휠 다운을 할 경우 아래와 같이 코드를 작성할 수 있습니다.

      ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *30 %A_ScriptDir%\Image\이미지.bmp
      if (ErrorLevel = 0 && (매크로시작 = ture))
      {
      ;이미지를 찾았을 때 원하는 작업
      }
      else
      {
      Send, {WheelDown}
      }

      그리고 30번 동안 못찾았을 때 백스페이스를 누르는 작업은 카운트 값을 저장하는 변수를 만들고 휠 다운을 한 다음 변수에 +1을 해준 뒤 30보다 큰지 확인하는 방식으로 하면 될 것 같습니다.
      우선 Loop가 시작되기 전에 아래와 같이 global 변수로 카운트를 만들어준 뒤 Loop내부의 코드를 아래와 같이 하시면 됩니다.
      ;루프 외부
      global 카운트 := 0

      ;루프 내부
      ImageSearch, FoundX, FoundY, %w_x%, %w_y%, %w_r%, %w_b%, *30 %A_ScriptDir%\Image\이미지.bmp
      if (ErrorLevel = 0 && (매크로시작 = ture))
      {
      ;이미지를 찾았을 때 원하는 작업
      }
      else
      {
      Send, {WheelDown}
      카운트 := 카운트 + 1
      if(카운트 > 29){
      Send, {BackSpace}
      break
      }
      }

      이 강좌는 매크로를 타겟으로 하고있지만 기본적인 오토핫키 사용법에 대해서 다루고 있기 때문에 마지막 강좌까지 공부하시는 동안 조급해 하지 마시고 꼼꼼하게 익히신다면 어렵지 않게 원하는 프로그램을 만드실 수 있을 것입니다.

  • gg 2015.10.14 14:15  댓글주소  수정/삭제  댓글쓰기

    예문- true 참인인데 오타죠?

  • 지나가는나그네 2015.11.15 19:58  댓글주소  수정/삭제  댓글쓰기

    질문이 있습니다.

    실행중인 창이 사용자로 인해서 최소화가 된 것을 감지하면 원래 창의 크기로 복구하는 스크립트를 짜는 중인데요. 생각보다 어려운데 조언 좀 부탁드립니다.

    ;---------------------------
    <사용되는 명령어>
    F1::
    Settimer, 최소화감지, 10000 ; 10초마다 최소화 감지
    return


    최소화감지:
    if ???? ; 음.. 만약 "ABC"의 창이 최소화라면 어떻게 짜야할지 감이 안오네요.
    WinRestore, ABC
    else
    Settimer, 최소화감지, Off ;

    • 킴영감 2015.11.16 11:07 신고  댓글주소  수정/삭제

      창이 최소화가 되면 창의 좌표 중 y값이 -가 되기때문에 이를 활용하시면 됩니다. 최소화 감지 부분에 아래와 같이 코드를 추가하시면 될 것 같네요^^
      CoordMode, Pixel, Screen
      WinGetPos, w_x, w_y, w_w, w_h, BlueStacks App Player
      if(w_y < 0){ -->최소화 조건
      WinRestore
      }

  • 프란치스코 2016.02.13 01:53  댓글주소  수정/삭제  댓글쓰기

    오토핫키 처음 접하는데 정말 재미있어서 지금까지 하고 있습니다. 새벽 두시를 넘어가고 있네요
    좋은 강의 더 많이 올려주세요^^

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

      재미있으시다니 제 기분이 좋네요ㅋㅋㅋ
      오토핫키 강좌 홈페이지를 개설해서 앞으로는 홈페이지를 통해 강좌를 진행할 예정이니 www.funlecture.com에 방문해보시기 바랍니다^^

  • 핫키 2016.02.20 20:03  댓글주소  수정/삭제  댓글쓰기

    F2처럼 F1을 누르면 매크로를 시작하도록 만들고싶은데요..
    매크로시작 := false

    return

    F1::
    {
    매크로시작 := true

    Gui,Submit,NoHide
    GuiControl, , A,시작
    }
    return

    Button시작:
    {
    Gui,Submit,nohide
    GuiControl, , A,시작

    매크로시작 := true
    클리어횟수 := 0
    Loop
    {

    이런식으로 추가했는데 매크로프로그램에서 시작 이라는 표시만뜨고 프로그램은 시작이안되요
    매크로시작 이라는 변수가 true로 안바꼈다는 뜻인가요??

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

      작성하신대로 동작하는 것입니다...^^
      매크로시작 이라는 변수가 true로 바뀐다고 프로그램이 시작되는 것이 아닙니다.
      시작 버튼을 눌러야 시작되도록 작성해놓으신 구조이며, 먼저 스크립트의 구조에 대해 다시한번 강좌를 보시면서 공부해보시기 바랍니다.^^

  • 고구마튀김 2018.12.24 15:33  댓글주소  수정/삭제  댓글쓰기

    6강좌 글에서 마우스 움직이는거 확인하고 7로넘어왔습니다

    7강에서 알려주신 걸 수정하고 사용하니 정지는 잘 작동하는거같은데 마우스가 안움직입니다 ㅠㅠ

    제가 뭘 이상하게해서 그런거 같은데 확인한번 가능하신가요?

    Gui, Add, Text, x30 y5 w110 h20, 매크로 프로그램
    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,

    return

    button시작:
    {
    gui,submit,nohide
    GuiControl, , a, 시작

    매크로시작 := true
    클리어횟수 := 0

    Loop
    {
    ;무한반복할 코드
    ImageSearch, foundX, foundY, 0,0, a_screenwidth, A_ScreenHeight, *50 C:\Users\COM\Desktop\1.png
    if ((errorlevel = 0) && (매크로시작 = ture))
    {
    send {click %foundx% %foundy%}
    sleep, 1000
    }
    ImageSearch, foundX, foundY, 0,0, a_screenwidth, A_ScreenHeight, *50 C:\Users\COM\Desktop\3.png
    if ((errorlevel = 0) && (매크로시작 = ture))
    {
    send {click %foundx% %foundy%}
    sleep, 1000
    }
    ImageSearch, foundX, foundY, 0,0, a_screenwidth, A_ScreenHeight, *50 C:\Users\COM\Desktop\4.png
    if ((errorlevel = 0) && (매크로시작 = ture))
    {
    send {click %foundx% %foundy%}
    sleep, 1000
    클리어횟수 := 클리어횟수 +1
    gui,submit,nohide
    GuiControl, , b, %클리어횟수%
    }


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

    }
    return

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

    F2::
    {
    매크로시작 := false

    gui,submit,nohide
    GuiControl, , a, 멈춤
    }
    return

  • sdri0903 2019.05.13 16:27  댓글주소  수정/삭제  댓글쓰기

    멈춤 버튼과 핫키가 눌리긴 하는데 안에 코드내용이 실행 되지 않은거같아요

    GUI 변수값도 멈춤!!! 으로 바뀌는거까지 확인된 상태입니다ㅠㅠ..

    Loop
    {
    ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, a_screenHeight, *TransBlack *40 bs\토벌아이콘.bmp
    if(errorLevel = 1)
    {
    ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, a_screenHeight, *TransBlack *40 bs\sss.bmp
    if((errorLevel = 0) && (매크로시작 := true))
    {
    Send, {click %FoundX% %FoundY%}
    sleep, 1500
    }
    if(매크로시작 := False)
    {
    break
    }
    }
    }
    return
    Button멈춤:
    F2::
    {

    매크로시작 := false
    gui,Submit,NoHide
    GuiControl, , A,멈춤!!!
    }
    return