오토핫키 강좌 #5 - 비활성 마우스 클릭 (오토핫키 붙여넣기)




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


오늘 드디어 비활성 매크로의 첫 걸음을 때려고 합니다!!


비활성 매크로를 쉽게 얘기하면 매크로가 돌아가는 중에 다른 작업을 할 수 있는 것을 말합니다.


이를 구현하는데 있어 가장 중요한 기능인 마우스 클릭을 비활성으로 구현해보았으며,


붙여넣기 강좌인 만큼 모든 분들이 붙여넣듯이 바로 사용하실 수 있도록 강좌를 진행할 것입니다.


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


1. PostMessage


우선 이해를 돕기위해 몇가지 부연설명을 드리겠습니다.


윈도우Message를 기반으로 사용자와 상호작용을 합니다. 이는 윈도우 프로그래밍에서 매우 중요한 개념이지만 어렵게 생각하실 필요는 없습니다. 예를 들어 마우스를 움직이는 행동은 윈도우에게 마우스를 특정 좌표로 옮기라는 쪽지(Message)를 보내는 것과 같습니다. 윈도우는 받은 쪽지에 적힌 내용을 수행하는 것입니다. "무슨말일까?"라고 더 생각하지 마시고 그래도 받아들이시면 됩니다^^


이처럼 윈도우와 상호작용을 하는 방법에는 SendMessagePostMessage가 있습니다. 

난이도가 있는 강좌가 아니기 때문에 쉽게 개념만 설명드리면 SendMessage는 쪽지를 보내고 그자리에서 바로 답장을 받아오는 것이고, PostMessage는 쪽지를 보내기만 하는 것을 의미합니다. 답장을 받는 것은 쪽지에 적힌 내용을 수행 여부를 의미합니다. 개념잡기가 어려우신분은 그냥 넘어가시고 사용방법만 익히시면 되겠습니다^^


위의 두가지 방법 중 PostMessage를 사용해서 비활성 클릭을 구현할 것입니다.


윈도우 프로그래밍을 해본 분들을 위해 간략하게 PostMessage사용 방법을 알려드리겠습니다.



PostMessage, Message, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText 


뭔가 복잡해 보입니다. 각 요소들의 의미를 설명드리겠습니다.


Message - 사용자가 윈도우로 보내는 Message 입니다. 각 기능(마우스 클릭 등)에 할당된 고유의 숫자가 있습니다.

wParam과 lParam - Message를 보낼 때 기능의 동작과 관련있는 정보를 보내는 부분입니다.

Control - 윈도우 핸들을 의미합니다. 생략해도 무방합니다.

WinTitle - 메세지를 보낼 창 이름을 의미합니다.

WinText - 메세지를 보낼 창에 포함되어 있는 text를 의미합니다.

ExcludeTitle - 제외할 창을 적는 부분입니다.

ExcludeText - 제외할 Text를 적는 부분입니다.


뭔가 잡다한 것들이 많이 붙어 있죠? 실제로 사용하실 때에는 아래와 같이 사용하시면 됩니다.


 PostMessage, Message, wParam, lParam, , WinTitle


이렇게 하면 윈도우프로그래밍을 하시던 분들을 바로 사용하실 수 있을 것입니다. "이건뭐지?"라는 생각이 드시는 분은 위에서 설명한 각 요소의 의미만 기억하시고 다음으로 넘어가시면 됩니다.



2. 비활성 클릭 함수


대부분 모니터 한대만 사용하시겠지만 듀얼 모니터를 사용할 때에도 사용 가능하도록 알려드리겠습니다.


우선 비활성 클릭 함수 스크립트입니다.


비활성 클릭


우선 코드 설명을 드리겠습니다.


함수를 실행할 때 넘겨받는 변수인 "x좌표"와 "y좌표"는 ImageSearch에서 찾은 이미지의 좌표입니다.


함수가 실행되면 WinGetPos를 사용해서 원하는 프로그램 창의 좌표를 구합니다.


그 다음으로 이미지의 좌표와 창의 좌표를 이용해서 프로그램 창 내부에서 이미지의 좌표를 계산하고 "내부좌표x"와 "내부좌표y"변수에 저장합니다.


PostMessagelParam값은 32비트로 구성되어야하며 마우스 클릭의 경우 x와 y의 좌표를 묶어서 32비트로 변환하게 됩니다. 어려우시면 lparam이라는 변수에 클릭할 좌표가 들어가고 좌표를 변수에 저장할 때 "x좌표|y좌표<<16"의 형식을 유지해준다고 이해하시면 됩니다.


PostMessage를 사용해서 마우스 클릭을 할 때 마우스를 눌렀다가 때는 동작을 하는 것입니다. 마우스를 누르는 동작을 의미하는 Message 값은 "0x201"이며 이때 wParam값은 항상 1입니다. 반대로 마우스를 때는 동작을 의미하는 Message 값은 "0x202"이며 이때 wParam값은 항상 0입니다.


WinTitle에는 블루스택을 이용했기 때문에 BlueStacks App Player라고 적었습니다. WinGetPos를 사용할 때와 같이 각자 사용할 프로그램의 이름을 적으시면 됩니다. 여기서 중요한 것은 반드시 작업관리자를 열어서 "응용 프로그램" 탭에 있는 이름으로 적어주셔야 한다는 것입니다. (띄워쓰기까지 똑같이 적어주셔야 합니다.)


마지막 줄에는 1초의 대기시간을 줬습니다. 여기서 대기시간을 주는 이유는 버튼을 눌렀을 때 화면전환 시간을 기다리는 역할을 합니다





이제 위 함수를 적용하는 방법을 알아보겠습니다.

붙여넣기 3강에서 실습했던 내용을 아래와 같이 수정하세요.



붙여넣기 3강에서는 특정 윈도우의 영역에서만 이미지를 검색하는 방법에 대해 실습 했었습니다. 모니터를 두개 이상 사용할 경우 반드시 ImageSearch의 영역을 지정해주셔야 올바르게 동작하기 때문에 위 그림의 첫번째 빨간 박스와 같이 영역을 구한 뒤 두번째 빨간박스와 같이 영역을 지정해주셔야 합니다.


3번째 빨간 박스부분이 비활성 클릭을 적용한 부분입니다. 엄청 간단하죠? 맨 아래 빨간 박스에 있는것 처럼 "비활성왼쪽클릭" 함수를 붙여넣듯 작성해 주신 뒤, ImageSearch에서 찾은 좌표를 가지고 비활성클릭함수실행만 시켜주시면 되는 것입니다.


각자 실습한 스크립트를 실행 해 보시면 클릭할 때 마우스가 움직이지 않는 것을 확인하실 수 있을 것입니다. 매크로를 돌리는 중에도 다른작업을 할 수 있게 된거에요~^^



이번 강좌는 비활성 클릭을 구현하는 필수 요소인 "PostMessage"의 간략한 사용방법과 이를 사용한 비활성클릭 함수 구현 적용방법에 대해서 알아봤습니다. Message를 처음 접하신 분들에게는 다소 어려울 수 있지만 기본적인 개념만 가지고 있으면 사용하시는 데에는 어려움이 없을 것입니다. "난 하나도 모르겠다"라고 생각하시는 분은 일단 붙여넣어서 사용하시다가 조금 익숙해 지시면 다시 공부하시면 됩니다^^


오토핫키로 매크로를 만들고 싶어하시는 분들의 최대 관심사인 비활성클릭에 대한 강좌를 해서 그런지 뿌듯한 느낌이 드네요~^^

항상 말씀 드렸듯이 반복적으로 실습하는 것이 가장 중요합니다. 꾸준히 노력하시다보면 정말 멋진 프로그램이 완성된 것을 볼 수 있을 것입니다. (제 강좌를 안보신 분은 꼭!! 기초강좌부터 차례대로 보시기 바랍니다)


그럼 붙여넣기 다섯번째 강좌를 마치겠습니다.

블로그 이미지

킴영감

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

,