오토핫키 강좌 #8 - 비활성 입력, PostMessage (오토핫키 붙여넣기)




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


한동안 일때문에 정신없다가 오랜만에 여유가 생겨서 강좌를 작성합니다.ㅠ


제가 강좌를 올리면서 모니터한 결과 비활성입력에 대한 관심도가 상당히 높은 것을 알게되었습니다.


그래서 이번 강좌에서는 비활성 입력에 대한 개념에 대해 자세하게 설명드리고 다음 강좌를 통해 찾기 어려워하시는 파라미터들을 정리해드리려고 합니다.


아직 프로그래밍이 익숙하지 않으신 분들은 이번 강좌를 열심히 보시고 개념을 확실히 잡으시기 바랍니다.


그럼 힘차게! 강좌를 시작해 보겠습니다.



1. 비활성의 의미와 개념


저는 개인적으로 게임매크로를 접하기 전까지 '비활성 입력'이라는 단어를 들어보지 못했습니다.


'비활성 입력'이라는 단어를 처음 접하고 아~이렇게 말할 수 있겠구나~라고 생각했죠...ㅋ


많은 사람들이 왜 '비활성 입력'이라는 단어를 사용하고, 선호하는지에 대해 알기위해서는 윈도우의 동작 구조를 이해하셔야 합니다.


윈도우는 '창'을 기본으로 동작하는 운영체재입니다. 바탕화면을 포함한 화면에 띄워지는 대부분의 요소가 '창'으로 이루어 져 있습니다.


대부분의 입력은 활성화 되어있는 창에서 동작하며 이들은 모두 '메세지'로 이루어 지게 됩니다.


이해를 돕기위해 그림을 그려보겠습니다.


만약 사용자가 특정 '창'에 키보드를 사용해서 '1'을 입력한다고 가정하면 아래 그림과 같습니다.



사용자가 키보드의 '1'을 누르면 윈도우가 이를 감지해서 활성화 되어있는 창에 '1'을 입력하는 메세지를 전달하는 것입니다.


메세지는 지난 강좌에서 설명드렸던과 같이 사람이 말을 하는 것과 같습니다. 제가 강좌를 보시는 분들께 코드를 따라서 작성하세요! 라고 하면 독자분들께서 코드를 따라 적으시는 것과 같습니다.


그럼 비활성의 의미는 무엇일까요?


아래 그림과 같이 간단하게 이해하시면 충분합니다.



깊이 들어가면 틀린말일 수도 있지만 이해하기 쉽게 설명드리겠습니다.


키보드와 마우스 입력은 윈도우에서 감지되면 활성화 되어있는 창으로 윈도우가 메세지를 보내는 것이지만


우리가 직접 제작한 프로그램을 통해 특정 창으로 특정 동작을 의미하는 메세지를 직접 보내는 것이 비활성 입력입니다. 

다르게 말하면 윈도우 운영체재가 전달하던 메세지를 사용자가 직접 원하는 창에 전달한다는 것입니다. 이렇게 직접 메세지를 전달하게되면 활성화 되어있지 않은 창에서도 특정 동작을 수행할 수 있게 되며, 이를 이용해 비활성 매크로를 제작할 수 있습니다.



2. 비활성 입력 방법


오토핫키로 프로그램을 작성해 보신 분들은 send의 유용함에 젖어 계실 것 같습니다. 하지만 노가다를 조금만 하시면 비활성 입력의 매력에 흠뻑 빠지실 것이라 생각 됩니다.


붙여넣기 5강에서 비활성 마우스 클릭에 대해 다루면서 postmessage에 대해서 설명 드렸지만 다시한번 설명드리겠습니다.


 PostMessage, Message, wParam, lParam, , WinTitle


사용하기 위한 틀은 위와 같으며 아래에 해당하는 값들로 채워주시면 됩니다.

(lParam과 WinTitle사이에 오타 아닙니다. , , 이렇게 한칸 비워두셔야 합니다.)


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

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

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

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


이제 각각에 해당하는 값들을 어떻게 찾아서 채울지만 남았네요^^


각각에 해당하는 값들은 기능에 따라 이미 정해져 있기 때문에 찾아보시고 채워넣으셔야 합니다.


예를 들면 마우스를 누르는 Message는 0x201, wParam은 1, lParam은 x, y좌표를 16비트로 합친 값, WinTitle은 '창 이름' 이런식으로 적으셔야 하는 것입니다.


수많은 Message와 각각의 Param값은 다음 강좌를 통해 조금씩 알려드리겠습니다. (한번에 다적기는 힘드니 업데이트 형식으로...^^)


3. 비활성 입력에 대한 고찰


많은 사람들이 왜 비활성을 찾는 것일까요?


제가 생각하는 이유는 프로그램이 특정 창을통해서 다른 작업을 하는 동안에 사용자는 직접 또 다른 작업을 할 수 있기 때문이라는 것입니다.


바쁜 직장인들, 학생들이 특정한 작업에 대한 시간적인 효율을 높이고자 찾는다 라고 하면 좀 더 그럴듯 하네요^^


이 같은 이유로 아주 좋은 수단이 되는 비활성 입력 프로그램(비활성 매크로)은 오토핫키를 사용하면 너무나도 쉽고 빠르게 제작할 수 있습니다.


하지만 코드를 작성하는 방법이 까다롭지 않음에도 많은 분들이 어려워하시는 이유는 뭘까에 대해 생각해봤습니다.


제가 내린 결론은 개념적 이해의 부족이 원인이라는 것입니다.


예를 들면 postmessage를 사용해서 키보드나 마우스를 입력하는 것은 단 두줄이면 끝입니다. 하지만 머리속에 위와 같은 그림이 그려지지 않으면 단 두줄의 코드도 '이건 뭐지?'라는 생각과 함께 어려워 지는 것입니다.



이런 분들에게 조언하고싶은 한마디가 있습니다.


'있지도 않는 숨은 뜻 찾을 생각하지 마시고, 있는 그대로를 받아들이십시오.'


명령어나 함수의 이름과 사용법을 알고 사용법대로 사용하기만 하시면 되는데, 이를 등한시 하면서 어려워 하지 마시라는 말입니다.


제 강좌를 보시는 독자분들 모두가 원하는 프로그램을 만드시길 원하는 마음에서 드린 말씀이니 노여워 하지 않으셨으면 합니다.^^


그럼 실제로 사용할 때 자주 발생하는 생각의 오류에 대한 고찰을 해 보겠습니다.


윈도우로 보낼 수 있는 메세지는 절대 모두 외울 수 없을만큼 많은 양이 있습니다. 이들 중에는 창을 닫는 것과 같이 특정 동작을 하도록 하는 메세지가 있는 반면에 단순한 입력을 하도록 하는 메세지도 있습니다.


오토핫키를 쓰시다보면 send를 통해서 "안녕하세요"와 같은 문자열을 한번에 입력해주는 아주 편한 기능이 있는 것을 아실 것입니다. 하지만 postmessage의 경우 키보드를 직접 눌러서 글을 적는것과 같은 동작(ㅇ,ㅏ,ㄴ,ㄴ,ㅕ,ㅇ,ㅎ,ㅏ,ㅅ,ㅔ,ㅇ,ㅛ 따로 입력)이 필요하다는 것을 많은 분들이 잊어버리거나 모르고 계시는 것 같습니다.


마우스입력을 예로들면 클릭하는 동작이 누르는 동작과 때는 동작이 연속적으로 이루어 져야한다는 것도 같은 맥락에 있습니다. 이 경우 역시 postmessage를 사용해서 누르는 동작의 메세지를 보낸 뒤 때는 동작의 메세지 역시 보내줘야 하는 것입니다. (키보드 입력할때도 누르는 것과 때는 것 모두 필요합니다.)


이점만 주의 하신다면 postmessage나 sendmessage를 사용해서 충분히 많은 것을 하실 수 있을 것입니다.


이번 강좌에는 뭔가 한풀이 하는 듯이 글을 적었네요.^^


다음강좌에는 실질적으로 도움이 되는 내용이 기다리고 있으니 그 전에 개념을 확실히 잡아놓으시길 바랍니다~^^


그럼 오늘 강좌는 여기서 마치겠습니다.

블로그 이미지

킴영감

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

댓글을 달아 주세요

  • 장호 2016.01.17 21:13  댓글주소  수정/삭제  댓글쓰기

    기가....막힙니다... 꼭 정주행하고 매크로제작 성공하겠습니다!!!

  • tw 2016.10.18 04:31  댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사합니다
    postMessage에 대해서 머리 아프신 분은 AutoGui를 검색하셔서 다운받은후 tools폴더 안에 Constantine.ahk를 실행시켜보시면
    각 이상한 숫자들이 대충 어떠한 뜻을 지니고 있는지 파악할 수 있습니다

    WM_LBUTTONDOWN := 0x201

    위와 같은 경우는 WindowMessage_Left Button Down 인 것이죠
    즉 postMessage는 윈도우한테 뭐 좀 부탁하는 쪽지를 보내는 것이고 (눌러줘) 이것만 보내면 어딜 어떻게 하라는지 모를테니
    lParam, wParam 같은 걸로 보충설명을 보내는 것입니다.

    이러한 메세지는 많은 종류는 가지고있고 각 메세지마다 lParam, wParam 본연의 역할은 좀 다를 수 있습니다
    예를들어 마우스 눌려주라는 것의 보충설명에는 좌표가 되겠지만
    윈도우를 종료시켜줘라는 메세지라면 보충설명에 좌표가 아니라 다른 것이 들어가겠죠.

    한 요정도만 알면 이제는 더 알려고 하지말고 계속 쓰다보면 점점 어떤 상황에 써야되는지 알게되면서
    그 진의도 자연히 깨닫게 될 것입니다


  • Divenire 2017.03.11 22:13 신고  댓글주소  수정/삭제  댓글쓰기

    글 잘 봤습니다. 프로그래밍으로 메크로제작하려다 오토핫키에 알아가던중 포스팅을 봤는데

    일반인들도 쉽게 이해하게끔 작성되었네요.

    추천 누르고 갑니다.

  • 갱그 2017.12.20 02:43  댓글주소  수정/삭제  댓글쓰기

    특정게임에 비활성 키입력을사용중입니다
    Controlsend 기능으로사용중인데 다른키들은 스킬이다나가는데
    기본공격 A키로설정이되어있어서 게임상에서는무반응입니다 쳇팅창에서는 a키가입력되고있는데말이죠
    그래서 postMessage로 a키입력을했는데 이것도마찬가지이더군여 그래서 비활성말고 send기능으로 a down 을썻더니 작도이되더군여
    혹시 send, {a down} 이기능이 비활성모드에서는없는건가요 controlsend 기능에서는 a down 이안되는거같더군요
    간략히말씀드려서 비활성모드에서 a키를누르고있는 기능은없나요