오토핫키 강좌 #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를 사용해서 충분히 많은 것을 하실 수 있을 것입니다.


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


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


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

블로그 이미지

킴영감

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

,