오토핫키(AutoHotKey) 기초강좌 #8 - 매크로 만들기 응용 3 (While, GUI와 변수의 활용 1)




 전체 강좌

 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강 - 매크로 제작 예제
















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


열심히 달리다 보니 벌써 8번째 강좌가 되었네요^^


지난 강좌까지 잘 따라 오시고 테스트도 많이 해보셨나요?? 


기초 강좌가 거의 끝나가니 조금만 더 힘내시길 바랍니다!!


지난 강좌때 드린 말씀 중에 "여기까지만 알아도 그럴듯한 매크로를 만들 수 있고 여러가지 옵션을 코드로 바로 작성해서 사용하면 된다"라고 말씀 드렸습니다.


하지만, 보기에 좋은 떡이 먹기도 좋다고 했으니 GUI를 이용해 여러가지 옵션을 만드는 방법에 대해 알려드리려고 합니다. 


예를 들어 반복 횟수를 설정하거나 특정 동작의 유무를 결정하는 등 많은 기능들을 생각할 수 있습니다. 이를 구현하기 위해서는 오늘 배우는 GUI 요소들과 변수의 개념과 사용방법에 대해 확실하게 아시는 것이 중요하기 때문에 프로그램을 고급스럽게(?) 만들고 싶으신 분은 꼭!! 모두 이해하셔야 합니다. (2개의 버튼만 있으면 되다는 분은 변수의 활용 부분만 보시면 됩니다.^^)


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


1. While


3번째 강좌에서 Loop를 배웠습니다. Loop어떤 동작을 반복하고 싶을 때 사용한다는 것을 알고 계실 것입니다. 오늘은 Loop의 고급형(?)이라고 할 수 있는 While에 대해 배워보겠습니다.


While은 특정 조건을 만족하면 중괄호 내부의 코드를 반복해서 실행합니다.


사용방법을 살펴보면


 While (조건)

 {

   반복해서 동작시킬 내용

 }


어디서 많이 본것 같은 느낌이 드시죠?^^

여기서 핵심은 "조건"입니다. Loop의 경우에는 옵션으로 반복횟수만 설정할 수 있었습니다. 하지만, While문은 조건을 만족하는 한 무한히 반복하기 때문에 더 많은 자유도가 주어집니다. 덧붙여 말하면 7강에서 배운 if와 마찬가지로 여러개의 조건을 사용할 수 있기 때문에 응용능력만 키운다면 엄청나게 다양한 프로그램을 작성할 수 있습니다.


지난시간까지 사용했던 Loop를 While로 바꿔보겠습니다.


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


오토핫키 while


우선 코드를 보다보니 잘못된 부분이 눈에 들어오네요...ㅠ "ture"로 되어 있는 것을 위 그림처럼 "true"로 모두 바꿔주세요. 아래의 if의 조건으로 적은 부분도 모두 고치셔야 합니다.


별표로 표시한 부분이 Loop를 While로 바꾼 부분입니다. Loop 대신 While을 적고 조건을 적어주시면 됩니다. "매크로시작" 변수에 "true" 라는 값이 들어있으면 계속 반복하겠다는 뜻입니다.

중괄호 내부에 코드가 짧아진 것을 느끼셨나요?? 3강에서 작성한 루프 탈출을 위한 부분이 사라졌습니다.

Loop는 탈출할 수 있는 조건을 설정할 수 없기 때문에 break를 사용해서 탈출을 시켜줘야 했지만 While은 기본적으로 조건을 만족해야 반복을 하기 때문에 필요가 없는 것입니다. 다르게 말하면 조건을 만족하지 않으면 중괄호 내부의 코드를 실행하지 않고 다음으로 넘어가게 됩니다.


여기까지 스크립트를 작성 하셨으면 테스트를 해본 다음에 "GUI와 변수의 활용 1"로 넘어가시기 바랍니다.


2. GUI와 변수의 활용 1


이전 강좌까지 우리는 Button과 Text만 사용해서 스크립트를 작성했습니다. 여러가지 기능을 가진 매크로를 구현하기위해 Edit, Checkbox, ComboBox 등 여러가지 GUI요소들을 사용할 수 있습니다. 오늘은 Edit에 대해 알아볼 것이며 실제로 적용했을 때 어떻게 사용해야 하는지에 대해 배워보겠습니다.


2-1. Edit


Edit는 프로그램 사용자로부터 텍스트를 입력받고 싶은 때 사용합니다.


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


 Gui, Add, Edit, 옵션, 초기 값


사용하는 방법은 모든 GUI가 유사한 형태를 가집니다. Add, 뒤에 Edit을 적어주고 옵션과 초기값을 적어주시면 됩니다.


빠른 이해를 위해 바로 우리 프로그램에 적용해 보도록 하겠습니다.


아래와 같이 코드를 작성하세요.


오토핫키 edit


빨간박스 안에 있는 부분이 추가한 코드입니다. 시작버튼이 있는 자리에 Text와 Edit를 추가했기 때문에 버튼의 좌표를 위 그림과 같이 수정해주셔야 합니다.

Edit의 옵션 부분에 변수이름을 "반복횟수"로 설정했습니다. 값을 바꿔 줘야하기 때문에 "v반복횟수"라고 적은 것입니다. 초기 값을 적는 부분에 0이라고 적었습니다. 프로그램을 실행시키면 Edit에 0이 입력되어 있을 것입니다.


GUI구성은 코드만으로 작성하기에는 상당한 시간이 필요합니다. 하지만 아직 간단하기 때문에 코드로 바로 작성하고 

추후에 GUI Creater를 사용하는 방법에 대해 알려드리겠습니다.


그럼 "F5"를 눌러서 실행해봅시다.



화면이 이쁘게 구성되었네요.^^


이제 매크로의 반복횟수를 정해줄 수 있습니다.



여기서 While의 진가가 들어나게 됩니다.


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


오토핫키 while


이전 강좌에서 "클리어횟수" 변수를 만들어 놓았고 3번 이미지를 클릭할 때에 1씩 더해주도록 해놓았기 때문에 던전을 몇번 클리어 했는지 알 수 있습니다. 


While의 조건을 보시면 7강에서 배운 것과 같이 3개의 조건을 사용했습니다. 괄호에 주목해서 보시면 (매크로시작 = true) 가 조건1, (클리어횟수 < 반복횟수) || (반복횟수 = 0)조건2가 됩니다. 이 사이에 있는 "&&"는 양 옆에 있는 조건을 모두 만족해야 함을 의미합니다. 조건2는 (클리어횟수<반복횟수)조건 2-1, (반복횟수 = 0)조건 2-1이 됩니다. 이 사이에 있는 "||"는 양 옆에 있는 조건 중 하나만 만족하면 된다는 의미입니다. 

조건을 생각하실 때 순서는 조건2-1 와 조건2-2 의 결과 → 조건1 과 조건1 의 결과로 하시면 이해하시기 편할 겁니다.


말로 풀어서 다시한번 설명드리면 시작버튼을 누른 뒤에 한줄씩 실행되고 While을 만났을 때 클리어횟수가 반복횟수보다 작거나 반복횟수가 0일때와 함께 매크로시작 변수에 true값이 들어있어야 중괄호 내부의 코드를 반복해서 실행하는 것입니다.


조건을 조금 더 쉽게 접근하시려면 수학시간에 배웠던 "명제"와 같다고 생각하시면 됩니다.


마지막으로 24번줄에 있는 코드를 봐주세요.

Gui, Submit, nohideGUI의 내용이 변경되었을 때 업데이트 하는 코드입니다. Submit의 의미를 업데이트라고 생각하시면 됩니다.

매크로를 시작하기 전에 Edit에 입력된 반복횟수의 값을 받아와야 하기때문에 반드시 적어주셔야 되며 우리는 앞서 프로그램을 실행 시킨 뒤 매크로 상태를 표시하기 위해 미리 추가를 했기 때문에 넘어간 것입니다.



오늘 강좌는 유난히 길게 느껴지네요...ㅠ


내용이 조금씩 어려워 지는데 조금이라도 쉽게 설명드리려고 하다보니 시간이 많이 걸리는 것 같습니다.


앞으로 진행되는 강의는 조급한 마음에 따라하는 것에 그치면 응용이 어려워 쉽게 포기하는 경우가 생길 수 있습니다. 그러니 마음을 느긋하게 가지고 최대한 많이 연습에 연습을 거듭하시고, 반드시 익숙해 지신 다음에 다음 강좌를 보시기 바랍니다.


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

블로그 이미지

킴영감

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

댓글을 달아 주세요

  • 궁금 2015.08.23 19:55  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 늘 친절한 답변감사합니다 ^^
    보고 실습하면서 이미지서치만 쭈~~~욱 돌던걸 그나마 좀 줄여봤는데 스크립트는 아래와 같으며 (보기편하시라고 줄임!)

    button시작:
    {
    Loop
    {

    F2::

    화면 := 0

    화면 := 화면검색1()
    if(화면 = 1)
    {
    이미지서치 하고 맞으면 a := true

    while(a = true)
    {
    이미지서치해서 맞으면 클릭후 a := false
    }

    }
    else if(화면 = 2)
    {
    이미지서치 하고 맞으면 클릭후 b := true

    while(b = true)
    {
    이미지서치 하고 맞으면 클릭후 b := false
    }


    이미지서치 하고 맞으면 클릭후 c := true

    while(c = true)
    {
    이미지 서치하고 맞으면 클릭후 c := false
    }

    }

    화면검색1()
    {
    Loop
    {
    이미지서치해서 이미지1.png 가 맞다면
    {
    return 1
    }
    이미지서치해서 이미지2.png 가 맞다면
    {
    return 1
    }
    이미지서치해서 이미지3.png 가 맞다면
    {

    return 2
    }

    .... 반복해서 이미지 8까지 검색

    }
    }

    }

    }

    시작버튼을 눌러서 F2를 누르면 차례대로 진행되는거 같더니 하다가 갑자기 "return" must be encountered prior to this"}" 라는 메세지가 뜹니다. 아무래도 중괄호전에 return을 넣으라는거 같은데 return을 넣게되면 반복해야할게 한번만 반복하고 말아서 ㅠ_ㅠ.... 뭐가 문젠가 해서 질문차 또 댓글을 답니다~~!

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

      수정할 부분이 좀 있네요.^^ 우선 시작버튼과 F2 버튼이 겹칩니다.
      F2를 꼭 눌러야되는것이 아니라면 코드에서 F2:: 부분을 지우시면 될 것 같습니다. 꼭 F2를 눌러야 된다면 시작버튼 대신에 F2만 누르면 동작 하게끔 하시면 됩니다. 그리고 화면검색1()은 버튼시작 중괄호 밖에 와야됩니다^^
      두가지 경우의 수정된 코드를 모두 적어드릴게요~

      시작버튼만 누르면 되게한 코드
      button시작:
      {
      Loop
      {

      화면 := 0

      화면 := 화면검색1()
      if(화면 = 1)
      {
      이미지서치 하고 맞으면 a := true

      while(a = true)
      {
      이미지서치해서 맞으면 클릭후 a := false
      }

      }
      else if(화면 = 2)
      {
      이미지서치 하고 맞으면 클릭후 b := true

      while(b = true)
      {
      이미지서치 하고 맞으면 클릭후 b := false
      }


      이미지서치 하고 맞으면 클릭후 c := true

      while(c = true)
      {
      이미지 서치하고 맞으면 클릭후 c := false
      }

      }
      }
      }

      화면검색1()
      {
      Loop
      {
      이미지서치해서 이미지1.png 가 맞다면
      {
      return 1
      }
      이미지서치해서 이미지2.png 가 맞다면
      {
      return 1
      }
      이미지서치해서 이미지3.png 가 맞다면
      {

      return 2
      }

      .... 반복해서 이미지 8까지 검색

      }
      }


      F2를 눌렀을 때 시작하도록 수정한 코드
      F2::
      {
      Loop
      {

      화면 := 0

      화면 := 화면검색1()
      if(화면 = 1)
      {
      이미지서치 하고 맞으면 a := true

      while(a = true)
      {
      이미지서치해서 맞으면 클릭후 a := false
      }

      }
      else if(화면 = 2)
      {
      이미지서치 하고 맞으면 클릭후 b := true

      while(b = true)
      {
      이미지서치 하고 맞으면 클릭후 b := false
      }


      이미지서치 하고 맞으면 클릭후 c := true

      while(c = true)
      {
      이미지 서치하고 맞으면 클릭후 c := false
      }

      }
      }
      }

      화면검색1()
      {
      Loop
      {
      이미지서치해서 이미지1.png 가 맞다면
      {
      return 1
      }
      이미지서치해서 이미지2.png 가 맞다면
      {
      return 1
      }
      이미지서치해서 이미지3.png 가 맞다면
      {

      return 2
      }

      .... 반복해서 이미지 8까지 검색

      }
      }

    • 2016.08.09 20:28  댓글주소  수정/삭제

      비밀댓글입니다

  • 궁금 2015.08.23 20:15  댓글주소  수정/삭제  댓글쓰기

    오오 바로해결됐어요! 버튼시작 괄호밖에다가 쓰니까 아까같은 에러가 안뜨는군여 ㅠ_ㅠ 감사합니다!

    아 그리고 버튼은 눌러서 시작한다 쳐도 중간에 멈췄다가 다시 재가동을 하고싶을땐 그 핫키를 어디다가 입력해야 하나요 ? 그것도 버튼시작 밖에다가 입력하면될까용 ?

  • hamtal 2015.09.30 18:27  댓글주소  수정/삭제  댓글쓰기

    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, x35 y80 w100 h20, 시작 ; 시작 버튼
    Gui, Add, Button, x20 y110 w130 h20, 종료 ; 종료 버튼
    Gui Show

    global 매크로시작 := false

    CoordMode, Pixel, Screen
    CoordMode, Mouse, Screen
    return

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


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

    화면 := 0
    While(매크로시작 = true)
    {
    화면 := 화면검색1()
    if(화면 = 1)
    {
    원정함수( )
    }
    else if(화면 = 2)
    {
    보급( )
    }
    }

    화면검색1( )
    {
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\로비.png ; 출격 로비 확인
    if (ErrorLevel = 0)
    {
    return 1 ;로비 반환
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\다음.png ; 원정완료 확인
    if (ErrorLevel = 0)
    {
    return 2 ;원정확인 반환
    }
    }
    원정함수( )
    {
    ;무한 반복할 코드
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\로비.png ; 출격 로비 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;출격 좌표 클릭
    Sleep, 2000 ;2초 대기
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\원정1.png ; 원정1 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ; 원정1 클릭
    Sleep, 2000 ;2초 대기
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\2번원정.png ; 2번원정 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;2번원정 클릭
    Sleep, 2000 ;2초 대기

    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\결정.png ; 결정 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;결정 클릭
    Sleep, 2000 ;2초 대기
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\원정개시.png ; 원정개시 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;원정개시 클릭
    Sleep, 4000 ;1초 대기

    클리어횟수 := 클리어횟수 + 1
    Gui,Submit,NoHide
    GuiControl, , B, %클리어횟수% 회
    }
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\6번원정.png ; 6번원정 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;6번원정 클릭
    Sleep, 2000 ;2초 대기

    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\결정.png ; 결정 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;결정 클릭
    Sleep, 2000 ;2초 대기
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\4함대.png ; 4함대 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;4함대 클릭
    Sleep, 2000 ;2초 대기
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\원정개시1.png ; 원정개시1 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;원정개시1 클릭
    Sleep, 4000 ;4초 대기

    클리어횟수 := 클리어횟수 + 1
    Gui,Submit,NoHide
    GuiControl, , B, %클리어횟수% 회
    }
    }

    send {Click 43, 101} ; 모항귀환
    Sleep, 3000
    }
    보급( )
    {
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\다음.png ; 다음 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;다음 클릭
    Sleep, 7000 ;7초 대기
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\보급.png ; 보급 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;보급 클릭
    Sleep, 3000 ;3초 대기
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\2함대.png ; 2함대 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;2함대 클릭
    Sleep, 3000 ;3초 대기

    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\모두선택.png ; 모두선택 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;모두선택 클릭
    Sleep, 3000 ;3초 대기
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\전부보급.png ; 전부보급 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;전부보급 클릭
    Sleep, 3000 ;3초 대기
    }
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\3함대.png ; 3함대 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;3함대 클릭
    Sleep, 3000 ;3초 대기

    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\모두선택.png ; 모두선택 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;모두선택 클릭
    Sleep, 3000 ;3초 대기
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\전부보급.png ; 전부보급 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;전부보급 클릭
    Sleep, 3000 ;3초 대기
    }
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\4함대.png ; 4함대 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;4함대 클릭
    Sleep, 3000 ;3초 대기

    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\모두선택.png ; 모두선택 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;모두선택 클릭
    Sleep, 3000 ;3초 대기
    }
    ImageSearch, FoundX, FoundY, 0,0, A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\전부보급.png ; 전부보급 확인
    if (ErrorLevel = 0)
    {
    Send {Click %FoundX% %FoundY%} ;전부보급 클릭
    Sleep, 3000 ;3초 대기
    }
    }
    send {Click 43, 101} ; 모항귀환
    Sleep, 3000

    }

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

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

    return



    현재 이상태로 인터넷으로 봐가면서 스크립트 짰는데

    Break/Continue must be enclosed by a Loop.

    이러한 오류문구가 뜨네요



    제가 보기엔 break문이나 continue문을 넣으라는거 같은데



    if(매크로시작=false)

    {

    break

    }

    이걸론 안되는건가여?

    이게 고쳐져야 나머지것들도 해볼텐데;;

    • 킴영감 2015.09.30 20:45 신고  댓글주소  수정/삭제

      break와 continue가 반드시 중괄호 내부에 있어야 한다는 에러 문구입니다.
      괄호가 안맞는 것 같으니 제일 밖에서부터 확인해보시면 Loop 밖에있는 break나 continue를 찾을 수 있을 것입니다. 이를 루프내부로 넣어주시면 문제가 해결될 것 같습니다.

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

    아래처럼 괄호가 없어야 동작이 되는데요. 뭐가 잘못되었나요?
    while 매크로시작 = true

  • redrwa 2015.12.04 20:15  댓글주소  수정/삭제  댓글쓰기

    응용해서 하는 중인데
    1.
    Gui, Add, Text, x30 y120 w70 h20, E_mail 1:
    Gui, Add, Edit, x75 y115 w150 h20 vE_mail 1

    Gui, Add, Text, x30 y160 w70 h20, E_mail 2:
    Gui, Add, Edit, x75 y155 w150 h20 vE_mail 2

    이런식으로 했는데 실행하면
    The same variable cannot be used for more than one control
    라면서 저 마지막 명령에 문제가 있다고 하는데 그 오류창에는 2 표시가 안생겨요ㅠ
    잘되다가 왜 안되는지 모르겠어요ㅠ

    2.
    원래 gui 할 줄 몰라서
    이메일:="~~이메일주소~~~"
    ControlSend,Edit1,%이메일%,Internet Explorer
    이런식으로 명령을 짰었는데
    gui에서 E_mail 1,2,3,... 이 edit칸에 입력된 메일주소를 나중에 매크로 시작했을때
    controlSend 이용해서 하고 싶은데
    ControlSend, Edit1, %vE_mail 1%, Internet Explorer
    ControlSend, Edit1, %E_mail 1%, Internet Explorer
    둘다 안되더라구요 찾아보니까 E_mail 1=(vE_mail 1에 입력한 값)이걸 loop를 이용해서 다음 숫자에도 적용하고 싶은데 어떻게 명령을 짜야하나요?ㅠㅠ

    3. ControlSend, Edit1, %E_mail 1%, Internet Explorer
    이런식으로 할때 E_mail 1 이 이메일주소라서 ~~~@gmail.com이런식인데 주소라서 길어서그런지 저 명령 전후로 2초정도 쉬게 해도 @가 2로 쳐질때도 있고
    ControlSend, Edit3, {backspace 10}, Internet Explorer
    에서도 {backspace}가 backspace}이렇게 화면에 쓰여져버릴때도 있더라구요ㅠ 이런 오류 어떻게 명령을 바꾸면 없앨수있을까요?ㅠ

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

      우선 1번 질문의 내용은 변수명에 띄어쓰기가 들어가서 발생하는 것 같습니다. 띄어쓰기를 모두 없애고 실행해보시면 2번 문제도 해결될 것 같으니 시도해보시기 바랍니다^^

  • 감사합니다 2015.12.06 17:52  댓글주소  수정/삭제  댓글쓰기

    영감님 강의 잘봤습니다. 대박이에요~~ 오토핫키 너무 재밌네요!!

  • 고마워요 2015.12.11 09:57  댓글주소  수정/삭제  댓글쓰기

    While((매크로시작 = true) && (클리어횟수 < 반복횟수)) ll << 이거 기호가 어떻게 되나요 i도아니고 l도아니고
    뭘써야할지 모르겠어요

    그리고 오토핫키만드는과정에 쓰이는것들은 뭘 공부하면 배울수있나요?
    너무 매력적이네요 프로그래밍

  • 2015.12.14 12:24  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

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

      우선적으로 오토핫키 명령어에 대한 이해가 필요하신 것 같습니다.
      Send는 키를 누르고 있는 것이 아니고 한번 눌렀다가 때는 동작을 하도록 합니다. 초보님이 작성하신 코드는 Ctrl키가 씹히는 것이 아니라 눌렀다가 때는 동작을 하는 것입니다.
      키를 계속 누르고 있도록 하기위해서는 아래와 같이 수정하시면 됩니다.
      Send, {Ctrl Down}
      이와 같이 작성하게되면 Ctrl키가 계속 눌러져 있는 것과 같은 동작을 하며 반대로 때는 동작은 아래와 같이 사용할 수 있습니다.
      Send, {Ctrl Up}

  • 2016.08.09 20:31  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  • macqueen0987 2018.01.13 00:43  댓글주소  수정/삭제  댓글쓰기

    아직 완성된건 아니지만 저기 edit 부분에 있는 숫자를 변수로 정하고 변수 하나하나 값을 지정해서 그 값을 B부분에 불러오고 싶은데.. 이렇게 하려면 어떻게 해야하나요???

    Gui, add, text, x30 y30 w150 h30, 화학 질량 입력기
    Gui, add, text, x30 y65 w80 h30, 화학원소 번호:
    Gui, add, edit, x115 y65 w50 h20 vB, 0
    Gui, add, text, x30 y95 w80 h30, 화학원소 질량:
    Gui, add, text, x110 y95 w50 h30 vA, 0
    Gui, add, text, x170 y95 w10 h30 , g
    Gui, add, button, x30 y115 w150 h30, 시작
    Gui, add, button, x30 y145 w150 h30, 종료
    Gui Show

    메크로 := false
    화학원소 := 0
    return

    button시작:
    {
    메크로 := true
    화학원소 := B
    if(화학원소 = 1)
    {
    Gui, Submit, nohide
    GuiControl, ,A,118.71
    }
    }

    return

    button종료:
    {
    메크로 := false
    ExitApp
    }

    • m0x 2018.06.05 03:31  댓글주소  수정/삭제

      질문의 요지를 잘 이해하지 못했습니다만.. 하나의 변수에 여러 값을 동시에 저장할 수는 없습니다. 배열을 이용하는 방법을 찾아봐야겠죠. 이게 원하시는 답이 맞는지도 모르겠습니다만..

  • m0x 2018.06.05 03:29  댓글주소  수정/삭제  댓글쓰기

    While 문의 예제 34, 40, 47번째 줄의 '매크로시작 = true'라는 조건은 While 문의 조건으로 내제되어 있으므로 중복된 코드이니 제거해도 좋다고 이해하고 넘어가도 될까요?

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

      제거하셔도 무관합니다~ 하지만 중복되는데도 적어놓은 이유가 있습니다.^^
      if에 있는 '매크로시작 = true'를 지우시게 되면 While문이 끝까지 실행되지만 각 조건문에 '매크로시작 = true'가 있으면 While 내부를 실행하던 중간에 false로 바뀌면 불필요한 작업을 하지 않게 되서 예제와 같이 만들어 놓은 겁니다.^^

  • y2k136 2018.07.30 16:04  댓글주소  수정/삭제  댓글쓰기

    ;Gui, Font, underline
    Gui, font, s13, Arial
    Gui, Margin
    Gui, Add, Text, x30 y10 , FinalBlade Auto daily quest
    Gui, Add, Text, x50 y60 ,State :
    Gui, Add, Text, x110 y60 w50 vA, Wait
    Gui, Add, Button, x10 y100 vB, Start
    Gui, Add, Button, x85 y100 vC, Pause
    Gui, Add, Button, x170 y100 vD, Stop
    Gui, Add, Button, x95 y140 vE, Exit
    ; Gui, Add, Edit, vA -> Gui, Submit 실행(바꾸기 가능)
    Gui, Show


    mstate := false
    CoordMode, Pixel, Screen
    CoordMode, Mouse, Screen
    return

    ButtonStart:
    {
    mstate := Start
    Gui, Submit, nohide
    GuiControl, ,A, Runing
    While(mstate = Start)
    {
    ImageSearch, FoundX, FounY, 0, 0 , A_ScreenWidth, A_ScreenHeight, *50 %A_ScriptDir%\image\heal.png ; increase accurcy when number was higher
    if (ErrorLevel = 0) ; if ErrorLevel = 0 Found, if =1 not Found, if =2 error on opening the image
    {
    Send {Click %FoundX% %FoundY%}
    }
    Sleep, 1000s
    }
    }
    return

    ButtonPause:
    {
    mstate := Pause
    Gui, Submit, nohide
    GuiControl, ,A, Pause
    While(mstate =Pause)
    {

    }
    }
    return

    ButtonStop:
    {
    mstate := Stop
    Gui, Submit, nohide
    GuiControl, ,A, Stop
    }
    return


    ButtonExit:
    {
    mstate := false
    ExitApp
    }
    return




    Start 와 pause 부분에서 이상한 현상이 발생되네요
    Stop으로 갔다가 start와 pause로 안가지는데 왜그런건가요??

    이미지를 찾아 클릭하는 부분도 안되네요

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

      mstate 변수에 들어가는게 문자열인데 조건에서 사용하실 때 큰따옴표를 안치셨네요^^
      while (mstate = "Start";)
      같이 작성하셔야 합니다^^
      블로그를 보고 공부하시는거라면 제 유튜브채널 가시면 좀 더 자세한 설명있으니 도움되실겁니다~^^
      유튜브에서 킴영감 검색하시면 됩니다~

  • 크리스베커 2019.07.27 16:38 신고  댓글주소  수정/삭제  댓글쓰기

    들어나게 -> 드러나게