오토핫키 PostMessage - otohaski PostMessage

이번 시간에는 이미지서치 다음으로 질문이 많은 PostMessage, 비활성에 쓰이는 키 코드 값에 대한 사용법을 알아보겠습니다.
어떻게 보면 카페 내에선 비활성 질문이 1순위네요. 시작합시다.

여기 저기서 흔히 알고들 있는 비활성 매크로, 어떻게 만들까요?
일단, 기본적으로 알고 있는

ID:=WinExist("ahk_class Legend of Darkages")...
...PostMessage, 0x100, xx, xxxxxxx,, ahk_id %Id%

특정 창을 확인한 뒤, 그 창에 키코드 값을 입력한다... 라고 볼 수 있는데요.
솔직히 뭔소린지 모르겠죠?

간단하게, "PostMessage, 0x100, xx, xxxxxxx,, Legend of Darkages"로 창을 직접 지정해주셔도 됩니다.

일단은, 일반적으로 쓰이는 MouseClick, Keyboard 등의 코드값을 알아보겠습니다.

0x100, 키를 누른다(누르고 있는다).
0x101, 키를 뗀다.
0x200, 마우스를 이동시킨다.
0x201, 마우스 왼쪽 버튼을 누른다.
0x202, 마우스 왼쪽 버튼을 뗀다.
0x203, 마우스 왼쪽 버튼을 두번 누른다(더블 클릭).
0x204, 마우스 오른쪽 버튼을 누른다.
0x205, 마우스 오른쪽 버튼을 뗀다.
0x206, 마우스 오른쪽 버튼을 두번 누른다... 등등이 있습니다.

Send처럼 키입력 신호를 준비하는 과정이 따로 필요하지 않는 대신 PostMessage는 키 하나씩만 입력 가능하게 되어있습니다.
그리고.. PostMessage와 비슷한 SendMessage도 있습니다.

둘의 차이점을 알아보겠습니다.

PostMessage(Queue), Message를 발생시켜 Queue에 입력하는 방식, 함수 메세지입니다. 마찬가지로,
SendMessage(Queue), Message를 발생시켜 Queue를 거치지 않고 핸들러 함수를 직접적으로 호출시키게 됩니다.


※솔직히 SendMessage는 잘 사용하지 않아서 설명을 제대로 못드리겠습니다.
※다시 한번 말씀드리지만 전 제가 필요한 부분만 배워서 이게 정확하다고 말씀은 못드립니다. 어떻게 쓰이는지 이해만 하세요.

PostMessage, 0x100, 65, 1966081,, Legend of Darkness


위의 키 코드 내용은 Legend of Darkness에서 알파벳 a를 눌러라.. 입니다.

65, wParam(명령)
1966081, IParam(위치) 정도로 아시면 되겠습니다. 이쪽에 관련지식이 없어서 저도 어렵네요.

그냥.. 대충 이해하고 사용법만 알도록 합시다!

키 코드 값을 알아내는 프로그램은 인터넷에 널려있으니 그걸 다운받아 사용하시면 될듯 합니다.


근데 위에 적은 내용처럼 쓴다면 문제점이 발생합니다.

Legend of Darkness란 창에서 알파벳 a를 눌러라.
만약 동접을 켜놓은 상태가 되면 마지막으로 클릭했던 Legend of Darkness 창에서"만" 알파벳 a를 누르게 되는 거죠.

쉽게, 어둠의전설 창이 1, 2가 있으면
처음 1번창을 클릭했을땐 1번창에서만 a를 연타합니다.
뒤에 2번창을 클릭한다면 역시 1번창에서는 인식을 하지 않고 새로 선택된 2번창에서만 a를 연타합니다.

왜그럴까용..


한가지 창에서만 비활성 매크로를 돌린다면 창이름을 변경시키는 등, 방법은 여러가지가 있습니다.
창이름을 변경시켜버리면 이름이 바뀌게된 Legend of Darkness는 해당이 되지 않기 때문이죠.

Legend of Darkness란 이름을 가진 모든 창에서 똑같이 a를 연타해라.
대표적으로 자객님 비활성매크로가 그 케이스입니다.


Program Manager, 윈도우(바탕화면) 자체를 활성화 시켜야 하는데요.
여기까진 아직은 어려울듯 하니 넘어가겠습니다(궁금하신 분은 직접 찾아보셔도 좋구요).

예를 들어보겠습니다.

스킬창 1, 2, 3번을 누른 뒤, 스펠창 1번을 눌러라(s123h1입니다).

PostMessage, 0x100, 83, 2031617,, Legend of Darkness, s
PostMessage, 0x100, 49, 131073,, Legend of Darkness, 1
PostMessage, 0x100, 50, 196609,, Legend of Darkness, 2
PostMessage, 0x100, 51, 262145,, Legend of Darkness, 3
PostMessage, 0x100, 72, 2293761,, Legend of Darkness, h
PostMessage, 0x100, 49, 131073,, Legend of Darkness, 1

참 쉽습니다..
그리고 2차 기술창이나, 2차 마법창을 사용해야 할때.

역시 마찬가지로 키보드를 누르는 순서대로 입력하시면 됩니다.

예를 들어, 2차 기술창 1번을 누른 뒤, 기술창 1번을 눌러라({Shift Down}s{Shift Up}1s1입니다).

PostMessage, 0x100, 16, 2752513,, Legend of Darkness, {Shift Down}
PostMessage, 0x100, 83, 2031617,, Legend of Darkness, s
PostMessage, 0x101, 16, 2752513,, Legend of Darkness, {Shift Up}
PostMessage, 0x100, 49, 131073,, Legend of Darkness, 1
PostMessage, 0x100, 83, 2031617,, Legend of Darkness, s
PostMessage, 0x100, 49, 131073,, Legend of Darkness, 1

마찬가지로 손으로 사용할때와 같은 순서입니다.

간혹, {Shift Down}s1s1 이런식으로 쓰셔서 안된다고 하시는 분들이 많은데 손으로 쓰는 것과 같은 순서입니다.

이번엔 마우스 클릭에 대해 알아보겠습니다.

위에서 언급했듯이 마우스 코드는 0x20N 입니다.

PostMessage, 0x200,, xxxxxxx,, Legend of Darkness

wParam은 쓰셔도 좋고 안쓰셔도 좋습니다. 전 안쓰니까요.

IParam의 기본 공식은 X좌표값+(Y좌표값x65536)으로 쓸 수 있습니다.
근데 상당히 귀찮죠.. 수십개가 들어갈지도 모르는 마우스 이동인데 언제 계산하겠습니까.

전 강좌에서 배운 변수를 사용하시면 됩니다.
만약, 마우스 좌표 100, 100으로 이동하고 싶다.

Move:=100|100<<16 (|는 Shift+\입니다.)
PostMessage, 0x200,, %Move%,, Legend of Darkness로 사용하거나

PostMessage, 0x200,, 100|100<<16,, Legend of Darkness로 사용할 수 있겠습니다.

<<16, 진수법, 16진수라고 합니다. 전 잘 모르겠습니다. 저도 모르는 거 투성이네요.

마우스 이동까진 배웠구요.
이번엔 마우스 이동, 클릭을 예로 들어보겠습니다.

Move:=100|100<<16
PostMessage, 0x200,, %Move%,, Legend of Darkness
PostMessage, 0x201,, %Move%,, Legend of Darkness
PostMessage, 0x202,, %Move%,, Legend of Darkness

MouseClick, L, 100, 100, 1 처럼 짧진 않지만 역시 간단하고 쉽습니다.

응용해 볼까요?

F1::
PostMessage, 0x100, 68, 2097153,, Legend of Darkness
PostMessage, 0x100, 49, 131073,, Legend of Darkness
Move:=100|100<<16
PostMessage, 0x200,, %Move%,, Legend of Darkness
PostMessage, 0x201,, %Move%,, Legend of Darkness
PostMessage, 0x202,, %Move%,, Legend of Darkness
Return

마법창 d, 1을 누른 뒤, X좌표 100, Y좌표 100의 위치를 클릭하라.. 입니다.

여기까지 모두 이해하셨을 거라 보구 이만 접도록 하겠습니다.

생각하면서 쓸려니 디기 힘드네요.

자료출처 : http://cafe.naver.com/sclod12/155940

지금 제 포스팅을 보고 계시다면 활성화된 창은 인터넷 창입니다. 지금까지 배웠던 이미지서치나 Send 방식 클릭으로는 활성화된 창이외엔 서칭 혹은 클릭할 수 없었죠. 활성된 창에서만 작동하는 매크로는 비효율적입니다. 컴퓨터로 다른 작업을 하기 어렵기 때문이죠. 녹스창을 구석으로 옮겨 놓고 다른 한쪽구석에서 동영상 정도는 볼 수 있겠죠. 하지만 비활성 명령어에 익숙해지고 사용이 가능해지면 활성화된 창이 아니더라도 이미지를 찾고 클릭을 하고 동작할 수 있게됩니다. 

이전 챕터에서 만들었던 매크로를 실행해 보셨다면 아시겠지만 마우스가 이리저리 움직이죠

매크로 동작에 방해가 될만큼 마우스이동을 계속해서 하고 있으면 매크로도 동작이 안되곤 합니다.

그래서 비활성으로 만들어서 좀더 완벽한 매크로로 만들어 보겠습니다.

#주의 비활성이 '최소화'를 말하는 것은 아닙니다. 최소화가 아닌 예를들어 지금 보고계시는 인터넷창 뒤에 녹스플레이어가 작동 되고 있다면 매크로가 동작한다는 의미입니다. 또한, 전체화면 모드가 실행되면 동장이 안되는 것 같습니다. 다른걸로 확인을 해보진 않았는데 녹스를 켜놓고 전체화면 게임을 하면 이미지서칭을 하지 못하더군요.

그럼 비활성 클릭 PostMessage부터 시작하겠습니다. 다른 명령어도 존재합니다만 제가 사용해본결과 저랑은 이게 잘 맞더군요.

일단 목적은 녹스 플레이어를 통한 테라M 매크로 만들기 입니다. 녹스창을 켜주시고 테라 아이콘의 좌표를 Active Window Info (Window Spy)을 이용해서 찾아보겠습니다.

오토핫키 PostMessage - otohaski PostMessage

녹스플레이를 한번 클릭해주면 활성화가 되죠 그상태에서 테라M에 마우스를 올리시면 Active Window Info (Window Spy)의 Mouse Position: 에서 Relative 값을 확인해주시면 됩니다.

제가 구한 값은 x519, y249 입니다. 

그럼 스크립트 보시겠습니다.

gui,show,w100 h100 center,chapter11

gui,Add,Button,x0 y0 w100 h50 gStart,Start

gui,Add,Button,x0 y50 w100 h50 gStop,Stop

return

#이정도 gui는 계속 보여 드렸던 어렵지 않은 gui이니 설명안드리겠습니다.

Start:

CLickX:=519

#Active Window Info (Window Spy)로 찾은 x값입니다.

ClickY:=249

#Active Window Info (Window Spy)로 찾은 y값입니다.

lparam:=CLickX|ClickY<<16

#ClickX  | ClickY << 16 은 PostMessage는 좌표값을 16진수로 받습니다. 좌표값을 16진주로 바꾼다 로 생각하시면 됩니다. ' | '는 Shift+\ 키입니다. '역슬래시' 라고 합니다.

PostMessage,0x201,1,%lparam%,,녹스 플레이어

#PostMessage 는 실행 명령어(마우스 클릭은 0x201),wparam(클릭은 그냥 1이다 생각하세요.),lparam(좌표값을 16진수 화한것),(여기는 실행칸? 정도로 생각하시면되는데 녹스는 없습니다. 비우시면 됩니다.),실행 창 이름(녹스 플레이어)