NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    기타 5. 완전 초보의 오토핫키 매크로 만들기. (반복과 조건)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 가끔 받는 질문이 코딩을 몰라도 오토핫키나 파이썬 또는 C#으로 매크로를 제작할 수 있느냐는겁니다. 솔직히 누구나 시간과 노력을 들이면 충분히 가능하다고 말할 수 있습니다. 영어나 중국어를 배우면 사람마다 차이는 있겠지만, 언젠가는 하게 되잖아요? 프로그래밍도 비슷합니다. 컴퓨터와 대화할 수 있는 언어(C, C#, Java, Python, AutoHotKey등등...)를 배우는거니까요^^; 하지만, 영어를 배우다가 포기하는 사람들도 많습니다. 대부분 노력과 시간을 투자할 수 없거나 이 시간에 다른 뭔가 더 생산성이 있는 일을 할수도 있죠. 매크로 제작도 비슷합니다. 프로그래밍 언어를 배워서 하느냐 아니면, 엔지엠 매크로와 같은 도구를 사용하느냐가 시간과 노력을 돈으로 해결하는겁니다. 내 한달의 시간이 엔지엠 에디터 비용으로 세이브되고 다른 뭔가로 그 이상 수익을 낼 수 있으면 어떻게 더 값진 일인지는 스스로만 알 수 있습니다^^

    dqFJ4rC.jpg

     

     

    저번 시간에 이어서 오늘은 오토핫키의 반복(while)과 조건(if)에 대해 알아보도록 하겠습니다. 비주얼 스튜디오 코드를 실행하고, 이전에 만든 스크립트를 불러옵니다.

    #SingleInstance, Force
    SendMode Input
    SetWorkingDir, %A_ScriptDir%
    Gui, Add, Text, x30 y5 w110 h20, 엔지엠소프트웨어
    Gui, Add, Text, x40 y25 w70 h20, NGM 매크로
    Gui, Add, Text, x50 y50 w50 h20 vCnt, Count: 0
    Gui, Add, Button, x20 y80 w110 h20, 시작
    Gui, Add, Button, x20 y110 w110 h20, 종료
    Gui, Show
    
    매크로시작 := False
    Return
    
    Button시작:
    {
        매크로시작 := True
        카운트 := 0
       Loop
       {
        if (!매크로시작)
        {
            Break
        }
        카운트++
        GuiControl,, Cnt, Count: %카운트%
        Sleep, 300
       }
    }
    return
    
    Button종료:
    {
        매크로시작 := False
        ExitApp
    }
    return

     

    위와 같은 내용으로 되어 있을겁니다. 그리고, 실행하면 아래 동영상처럼 반복하면서 0.3초마다 카운트 숫자가 증가하죠?

    AT2GcAJ.gif

     

     

    엔지엠 디자이너도 이와 비슷하게 동작됩니다. 디자인은 다르지만, 코딩 내용은 비슷합니다.

    GYJOvIM.gif

     

     

    오토핫키에서 반복문은 Loop로 감싸서 구현할 수 있습니다. 아래 코드를 보면 반복문(Loop)안에 조건과 카운트를 증가시키는 내용이 포함되어 있습니다. 그리고, GuiControl 함수를 이용해서 GUI에 반복 횟수를 알려주는 콘트롤의 내용을 갱신하고 있습니다. 개발자가 아니면... 아마도 여기서부터 생소한 용어들로 인해 머리가 아파올겁니다. 생소한 용어나 잘 이해가 가지않는 내용이 있으면~ 홈페이지 메뉴의 [ 커뮤니티 > 질문과 답변 게시판 ]에 남겨주세요^^

       Loop
       {
        if (!매크로시작)
        {
            Break
        }
        카운트++
        GuiControl,, Cnt, Count: %카운트%
        Sleep, 300
       }

     

    Loop 뒤에 아무것도 적지 않으면 무한 반복하게 됩니다. 코드를 아래와 같이 수정하고 다시 실행 해보세요. 수정 내용은 Loop뒤에 콤마와 5를 추가 했습니다.

    Button시작:
    {
        매크로시작 := True
        카운트 := 0
       Loop, 5
       {
        if (!매크로시작)
        {
            Break
        }
        카운트++
        GuiControl,, Cnt, Count: %카운트%
        Sleep, 300
       }
    }
    return

     

    실행하면 5회 반복합니다. 카운트가 5까지 표시하고 스크립트가 완료되는걸 알 수 있습니다.

    Ozkprua.gif

     

     

    엔지엠 에디터에서는 [ 액션 반복 ]으로 구간을 설정한 횟수만큼 반복할 수 있습니다.

    2Fn6iqz.gif

     

     

    엔지엠 매크로 디자이너로 코딩한다면 아래와 같이 처리할수도 있습니다. 개발자라면 아래 코드가 더 익숙할겁니다.

            private void playButton1_Click(object sender, EventArgs e)
            {
                new Thread(new ThreadStart((Action)delegate
                {
                    for (int i = 0; i < 5; i++)
                    {
                        label3.BeginInvoke(new Action(() =>
                        {
                            label3.Text = $"Count: {cnt++.ToString()}";
                        }));
                        Sleep(300);
                    }
                })).Start();
            }

     

    실행 해보면 오토핫키나 C#이나 크게 다른 부분은 없을겁니다. 하직까지는 코딩량이 비슷해서 큰 차이점을 못 느끼겠지만, 나중에는 엄청난 차이가 발생하게 됩니다. 물론, 반대로 C#으로 간단하게 할 수 있는것들이 오토핫키에서는 안되거나 엄청난 코드를 추가해야 할수도 있습니다. 언어마다 지향하는바가 달라서 벌어지는 일입니다. 그래서, 단순히 어떤 언어가 더 우월하다라고 단순 비교해서 말할수는 없습니다. 목적에 맞는 언어를 사용하면 되니까요^^

    TG8Y7Pm.gif

     

     

    오토핫키는 아래와 같이 조건을 하나 추가 해두었습니다. 매크로에서 시작 버튼을 누르면 매크로시작 변수에 True 값을 할당합니다. 아래 조건에서 매크로시작 변수의 값이 False라면 매크로는 실행되지 않습니다. 이 값은 종료 버튼을 누를 때 False로 갱신되고, 실행중인 스크립트를 중지하고 프로그램도 종료하게됩니다.

        if (!매크로시작)
        {
            Break
        }

     

    if 조건문은 거의 대부분의 프로그래밍 언어가 공통으로 사용합니다. 개발자라면 크게 어려운 부분은 없을거예요. 하지만, 비개발자라면 조건을 어떻게 사용해야 하는지 잘 이해가 안갈수도 있습니다. 전체적인 코드를 보면 매크로가 시작된 후 종료 버튼을 누르기 전까지 매크로는 무한 반복합니다. (Loop뒤에 숫자가 없다면...) 이 때 종료 버튼을 눌러서 프로그램을 닫아도 매크로는 계속 실행됩니다. 엔지엠 매크로와 엔지엠 디자이너는 프로그램을 닫으면 실행중인 스크립트를 자동으로 중지시켜주지만, 오토핫키는 직접 중지시키는 로직까지 생각해서 코드를 작성해야 합니다. 아래와 같이 종료 버튼을 누르면 매크로시작 변수에 False를 할당하고 ExitApp으로 프로그램을 닫아줍니다.

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

     

    엔지엠 매크로는 아무래도 유료 소프트웨어다보니 제작중인 스크립트가 저장되었는지 확인하고, 실행중인 스크립트도 종료해주고 프로그램이 닫힙니다. 오토핫키는 개발 도구다보니 딱히 이런 부분이 필요하지는 않습니다. 컴파일할 때 작성하던 코드를 저장해야 테스트를 할 수 있기 때문입니다. 일부 매크로 제작 프로그램들이 테스트와 실행이 분리되지 않고 별도로 처리해야 하는 경우들이 있습니다. 스크립트를 작성하고, 저장한 후 실행기로 확인하고 문제가 보이면 실행기를 닫고 다시 에디터를 열어서 수정하고를 반복해야 합니다. 엔지엠 에디터처럼 작성 또는 수정하면서 결과를 바로바로 확인할 수 있는 프로그램은 그리 많지 않습니다.

    1QrHxUA.gif

     

     

    조건(if)이 무엇인지 좀 더 확실하게 이해하기 위해 코드를 아래와 같이 변경 해줍니다. Mod는 나머지 값을 구할 때 사용하는 함수입니다. Loop 반복에서 카운트를 1씩 증가시키고, Mod 함수로 2로 나눈 후 나머지를 반환 받습니다. 나머지가 0과 같으면 짝수입니다. 그래서, 이 코드로 변경하고 실행 해보면 카운트가 2와 4 두번만 바뀌는걸 확인할 수 있습니다.

        카운트++    
        if (Mod(카운트, 2) = 0)
        {
            GuiControl,, Cnt, Count: %카운트%
        }

     

    대부분의 프로그래밍 언어에서는 나머지를 %로 구합니다. 하지만, 오토핫키는 % 기호가 예약어이기 때문에 코드에서 사용할 수 없습니다.

    EthSrHI.gif

     

     

    좀 더 응용해서 짝수, 홀수를 찍어볼까요?

        if (Mod(카운트, 2) = 0)
        {
            GuiControl,, Cnt, 짝수
        }
        Else
        {
            GuiControl,, Cnt, 홀수
        }

     

    다시 실행 해보면 조건에 따라 짝수, 홀수가 번갈아가면서 찍히는걸 알 수 있습니다.

    r2WrE8G.gif

     

     

    생각보다 간단하죠~? 아직 오토핫키 언어에 대해 10프로도 학습하지 않았습니다. 응용프로그램을 제어하는 방법부터 이미지 서치, 픽셀 서치, 하드웨어 방식으로 매크로를 동작시키는 방법과 DLL을 참조를 통해 기능을 확장하고 제약에서 벗어나는 방법들까지 많은 내용이 남아 있습니다. 하나씩 천천히 알아가보도록 하고 오늘은 여기에서 마치도록 하겠습니다. 긴 글 읽어주셔서 감사합니다^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.