프날 오토핫키 강좌
누르면 강좌 리스트가 나와요
프날 오토핫키 강좌

⚠ 이 강좌는 오토핫키 v1을 다룹니다

지금 보시는 강좌는 구버전 오토핫키(v1.1)를 다루고 있습니다. 따라서 본 강좌의 내용은 현재 최신 오토핫키 버전 (v2.0)과 호환되지 않습니다. 구버전의 정보가 필요한 것이 아니라면, 가능한 한 새로운 사이트에 작성한 v2 강좌(https://ahkv2.pnal.dev)를 봐주시길 바랍니다.

오토핫키 질문 요령

안녕하세요.

 

기존 작성하던 강좌를 갈아엎고 프날 오토핫키 강좌를 개설한지 벌써 3년을 지나려 하고, 드디어 질문을 받을 수 있는 창구를 개설하게 되었습니다. 비회원으로 누구나 질문만 적을 수 있다는 것이 장점이지요.

 

오토핫키 질문에 대해 아래 원칙을 지켜주시면 소통이 더 원활할 것입니다. 한 번 질문하고 두 번 재질문할 필요 없이, 단 한 번의 질문으로 원하는 답변을 받아내기 쉽다는 뜻입니다. 저로서도 여러분로서도 좋은 일이지요.

 


1. 우리 모두가 아는 상황이어야 합니다.

 

예를 들어서, 회사에서 사용하는 근태관리 프로그램에서 비밀번호 입력 후 "근무중" "자리비움"상태를 변환하는 매크로를 작성했다고 합시다. 자리비움과 근무중 상태는 해당 근태관리 프로그램의 버튼을 누르는 것으로 구현됩니다.

매크로를 짰는데 자리비움으로 바뀌질 않아요

라는 식으로 질문해버리면, 듣는 사람 입장에선 [매크로 실행]과 [자리비움]의 인과관계가 설명되지 않을 것입니다. 제가 여러분 회사의 근태관리 프로그램이 어떤 모양인지 알지도 못하고, 자리비움으로 바뀐다는 그 동작이 버튼을 눌러서 수행되는지, 키보드 입력으로 수행되는지, 아니면 사원증 인식 등으로 수행되는지 전혀 모르죠.

회사에서 사용하는 근태관리 프로그램은 개인 비밀번호를 입력한 후 [자리비움][근무중] 버튼 중 하나를 누르면 제 근무 상태가 해당 상태로 변경됩니다. (상황설명 - 꼭 필요한 경우 생략 가능)
매크로를 짰는데 비밀번호는 입력이 되는데 버튼으로 마우스가 움직이지 않고 엉뚱한 곳을 클릭합니다. (프로그램적인 문제 설명)

앞에 상황 설명을 써주시고, "자리비움으로 바뀌지 않는다"라는 모호한 설명 대신 "마우스 이동이 다르게 된다"라는 우리 모두가 아는 용어로 설명을 해주면 좋습니다. Coordmode 설정한 사항까지 말씀해주시면 완벽하겠죠.

 

 

2. 전체 코드를 올리지 말고, 테스트용 단위 코드를 올리세요.

 

전체 코드는 끔찍할만큼 복잡한 경우가 많습니다. 문제 재현을 위한 최소한의 테스트 코드를 제공해주시거나, 문제가 있는 코드에서 꼭 그 부분만 작성해주세요. 예를 들어서 위의 근태관리 프로그램 매크로와 같은 경우엔

마우스 클릭은 이렇게 했습니다.

MouseMove, 300, 200 ;근태관리 프로그램의 상태 버튼 위치
MouseClick, Left

이렇게 문제가 되는 부분만 작성해주는 것입니다. 전체 코드를 올리실 필요가 없습니다.

 

 

3. 제 강좌에서 배우신 후 와주세요.

 

가끔 보면 다른 곳에서 대충 배운 후 힘들게 짠 코드 가져와서 "안돼요" 하는 분들이 계십니다. 코딩 스타일만 봐도 제 강좌를 보고 오토핫키를 배운 사람과 안 배운 사람이 구분되어 보입니다. 다른 강좌가 모두 그렇다는 것은 아니지만, 일반적인 경우만 살펴보면...

 

다른 강좌 프날 오토핫키 강좌
'라벨' 용어 사용 '레이블' 용어 사용
Button 키워드 + ButtonText를 이용한 버튼 이벤트 처리 g 레이블을 사용한 버튼 이벤트 처리
무분별한 =를 이용한 대입 :=를 이용한 대입
블럭 { }의 남용 꼭 필요한 경우에만 블럭 처리
이미 사장된 명령어 사용 (StringMid, ifWinExist 등) 권장 명령어 사용 (SubStr(), if + WinExist() 등)
Traditional-if 사용 if var = value Expression-if 사용 — if (var = value)

다른 강좌에서 배우고 오셔도 프날에도 안나와있는 내용이면 괜찮긴 한데(프날은 기초강좌라 심화 내용이 없습니다.), 프날에서 이미 설명했던 내용 등을 가지고 질문 올려시면 막상 드릴 말이 없습니다.

 

프날이 국내에 현존하는 오토핫키 강좌 중에서 가장 정석에 가까운 코딩 스타일을 가르칠려고 노력하는 강좌 중 하나일 것입니다. 적어도 표준적인 내용으로, 권장 방법으로 작성된 코드를 작성하셔야 합니다. 비표준으로 똘똘 뭉친 다른 강좌 코드를 가져오셔도 허허... 할 뿐입니다. 그래서 이미 다른 곳에서 오토핫키를 접한 후 프날을 보시게 되면 기존 강좌를 잊어버린 후 프날에서 새로 배우시는 것을 추천드리는 편입니다. (물론 이미 잘 하시면 상관 없지만, 아직 제대로 배우지 않았다면요.)

 

아무튼... 이걸 말씀드리는 이유는 제 강좌만 봐야한다! 이건 아니고요, 물론 적어도 제가 생각하기에 프날이 가장 표준적인 내용을 담고 있기도 하고, 여러분의 질문에 대한 답이 이미 프날엔 있을 수 있거든요.

 

가령, 최근 메일을 통해 제 강좌만 들었으면 문제 없이 해결할 수 있었던 부분을 질문하신 분이 계셨습니다. 결론적으로 말씀드리면 [=] 대입과 [:=] 대입을 헷갈리신 것입니다. [=] 대입은 비표준이기도 하거니와 이미 용도폐기되었다고 봐도 무방한 대입 연산자입니다. 강좌에선 그래서 [=] 대입은 사용하지 마시라고 적어두었는데 말이죠. 다른 곳에서 배워오신 대입 연산자로서의 [=]를 이용해서 코딩하다가 일어난 일이었죠.

누가 마음대로 비표준이라고 하냐 그러면... 오토핫키 공식 도큐먼트가 그랬습니다.

그래서, 제 강좌를 보신 분들이 질문하셨으면 좋겠습니다. 설령 다른 곳에서 오토핫키를 미리 배웠어도, 질문하시기 전 프날에 해당하는 부분이 있는지 확인 후 질문 주시면 됩니다. 예를 들어서 GUI 버튼 동작이 안되어서 질문할려고 한다면 프날 오토핫키의 '50. Button과 g레이블' 강좌를 보고 오는 식인거죠.

4. 게임 등에 관해...

하도 질문이 많아서 이와 관련해서 별도 항목을 만들어 설명드립니다.

 

온라인 게임, 오프라인 게임, 패키지 게임, 서비스 종료되어 사설 서버 등으로 운영되는 게임, 암묵적으로 매크로가 허용되는 게임 등 모든 게임에 관한 질문은 받지 않습니다.

 

온라인 게임을 제외한 다른 게임은 매크로를 허용하는 경우도 일부 있다는 것은 잘 알고 있습니다. 그렇지만 질문 받을때마다 그 게임이 무슨 이름의 게임이고 어떻게 동작하는지, 약관 위반은 아닌지 등 일일이 확인하기에는 제가 너무 힘들기도 하거니와, "왜 나는 답변 안해주고 저 사람한텐 해주냐" 등의 이의가 있을 수 있기 때문에, 모든 게임에 대한 질문은 받지 않겠습니다. 이 부분에 대해서는 관리 문제 때문에 조금 제한을 크게 잡게 되었는데 이해 부탁드립니다.

 

또한, 금전수익과 관련되는 프로그램(모의주식을 포함한 주식, 상품권 번호 입력 등의 자동화)

매크로가 허용되지 않는 일반적인 상황(본인인증 창, 결제 창, 티켓팅, 비동의 크롤링, 게임 가드 우회 등)에서 사용하고자 하는 프로그램에 관한 질문도 받지 않습니다.

 

전자는 혹여나 금전이나 부당이득 등에 대한 책임 문제때문에 답변 드리지 않겠으며

후자는 말씀 안드려도 당연히 쓰면 안되겠죠?

 

마지막으로, 리버싱(프로그램 코드 역분석)에 관한 문의 또한 받지 않습니다.(저작권법 제101조의 4(프로그램코드역분석)) 본인 프로그램이라고 할지라도 일단은 받지 않습니다. 제 입장에선 이것이 본인 프로그램인지 남의 프로그램 뜯는건지 모르는 일이니까요. (코드 보관은 개발자의 책임입니다. GitHub등의 버전관리 서비스를 이용해보세요).

 

유난히 오토핫키에 대해 이런 질문이 많은 것이 너무 안타깝습니다.

프날 오토핫키 강좌는 강좌 서문에 써있듯이 게임 매크로 강좌가 아닙니다. 오토핫키라는 프로그래밍 언어를 강좌하는 공간이며, 따라서 질문 또한 프로그래밍 차원에서 받는 것입니다. 알고리즘 질문 등을 하기 위해서요. 좀 더 여러분들이 "프로그래밍을 배웠구나"라는 자각을 하셨으면 좋겠습니다. ('매크로 제작법을 배웠구나'가 아닙니다.)

 

프로그래밍을 처음 배우면 당연히 잘 안되는 부분이나 어려운 부분이 많고, 강좌에서 이해 안되는 부분이 많습니다. 이를 해소하고자 질문 공간을 만든 것이고, 추가로 강좌와 관련된 질문이 아니더라도 여러분이 프로그램을 개발하면서 생기는 문제들에 대한 질문까지도 허용하고 있습니다. 프로그램 배포 및 서비스 경험도 있어서 이와 관련해서도 아는대로는 말씀드릴 수 있습니다. 사실 굳이 오토핫키가 아니더라도 타 언어나 전체적인 프로그래밍을 배우는 과정, 관련학과 진학 등 아는 부분에선 답변드릴 수 있습니다. 따라서 위에 말씀드린 금지 내용만 아니면 자유롭게 질문 주시면 됩니다.

 

 

5. "특정 프로그램에서 XXX가 안돼요"에 관해...

이 부분도 질문이 많이 들어와서 추가 작성합니다.

 

오토핫키에서 특히 키 입력과 마우스 입력과 같은 명령어는 다른 프로그램과 상호작용하기 위한 명령어입니다. 즉, 키 입력이 들어가는 대상 프로그램이 있고, 마우스 입력이 될 대상 프로그램이 있다는 뜻입니다.

 

예를 들어서, "메모장"에 Send명령어를 이용하여 글을 입력할 경우 대상 프로그램은 "메모장"이 되겠죠.

 

그런데 모든 프로그램이 천편일률적이지 않고, 그 프로그램도 결국 다른 개발자의 손에 의해 개발된 프로그램입니다. 프로그램을 만든 방식에 따라 여러분이 오토핫키로 키 입력 혹은 마우스 입력을 할 수 없을지도 모릅니다. 굳이 그런 입력이 아니더라도, 창 자체에 여러 효과를 준다던가(WinSet 등) 기타 다른 경우에도 원하는대로 동작하지 않을 수 있습니다.

 

원인은 다양합니다. 입력을 받아들일 때 필터링이 있을 수도, 혹은 대상 프로그램의 개발자가 의도하지 않았더라도 기계적인 입력이 되지 않을수도 있습니다.

 

이는 오토핫키 스크립팅의 문제가 아닙니다. 아마 여러분도 이해하실겁니다. 여러분이 짜신 스크립트엔 정상 동작하는 구문이 적혀있고, 하필 그 프로그램에서 그 입력을 받아들이지 못할 뿐입니다. 이런 문제는 프로그래밍 질문이 아니고, 해당 프로그램의 접근성에 관한 문제이기 때문에 제가 아니라 그 프로그램 개발자에게 문의할 일입니다.

 

이런 "증상"에 관한 문제는 "원인"을 파악해야 답변을 드릴 수 있으나,

이렇게 대상 프로그램과 상호작용하는 경우엔 그런 원인이 적어도 스크립트에는 없습니다.

결국 해결책은 그 원인 따라 달라져야하는데, 원인이 대상 프로그램마다 제각각이기 때문에 일반화된 해결책이 존재하지 않습니다.

 

따라서 프로그래밍 질문을 하는 프날 질문창구에는 적합하지 않은 질문일 것입니다.

프로그래밍에 관련된 질문이 아니기 때문에, 제가 해결해드릴 수 없는 유형이기 때문입니다.

 

정리하면 이렇습니다.

 

1. 다른 프로그램과 상호작용하는 구문의 경우, 그 프로그램에 따라 작동이 원활하지 않을 수 있습니다.

2. 이 원인은 상호작용의 대상이 되는 프로그램마다 다르기때문에, 일반화된 해결책을 제시해드릴 수 없습니다.

3. 물론, 오토핫키 스크립트를 손봐서 해결이 불가능하단건 아닙니다. 해결이 가능할 수도 있지요. 그러나 이 역시 여러분이 스크립트를 많이 고쳐보고 테스트하는 방법으로 해결해야할 것입니다. 앞서 말씀드렸듯 딱 떨어지는 해결책이 없기 때문입니다.

4. 반대로, 스크립트를 손보는 것으로 해결을 못하는 경우도 있긴 할것입니다.

5. 그러므로 이런 종류의 질문은 제가 해결드릴 수 없습니다. 스스로 많은 시도를 해보시거나, 대상 프로그램 개발자에게 문의하는 편이 좋습니다.

 


위의 방법과 같이 질문 주시면 더욱 양질의 답변을 받으실 수 있습니다.

저 또한 가능한 한 최대한 답변해드리도록 하겠습니다.

 

감사합니다.