아래 포스트메시지 관련 질문이 있길래 , 그냥 제가 쓰는 방법이 좀 더러워서?? 다른분들은 어떻게 깔끔하니
쓰시나 궁금하네요.
일단 완전 쌩 입문자들 기준으로 썼으니까, 잘아시는분들은 하위 부분의 스크립작성을 좀 이쁘게 할수 있는 부분에
대하여 조언좀 부탁해요.
일단 포스트메시지는 , 작업창이 비활성인 상태에서 작동이 되는것이기 때문에 ,
픽셀로 좌표를 찾는?imagesearch등의 명령어는 스크린방식으로 해야합니다.
coordmode,pixel,screen 이걸 써야되죠.
coordmode로 별도 지정을 하지 않을경우, 핫키는 기본셋팅이, 모드 relative로 설정된 것으로 알고 있어요.
그렇기에 굳이 coordmode,pixel,relative 나 , coordmode,mouse,relative를 안써도 된다는거죠.
암튼, postmessage를 쓰려면 스크린으로해야하는데, 이유는 작업창(지니모션)이 비활성이라면 다른 창이
활성상태를 의미하죠. 그 창에 대한 좌표들이 relative로 잡히기때문에 비활성이 된 지니모션은 작동을 시킬수 없는거지요.
그래서 ,screen으로 잡을경우 비활성이건 활성이건 모니터 전체기준으로 잡기때문에, 좌표를 찍을수 있게됩니다.
위 내용은 제가 첨 포스트메시지 접할때 햇갈렸던 내용으로 첨 하시는분들 착오없으시라 적었습니다.
이제 포스트메시지 제가 쓰고 있는방식인데요.
다들 이렇게 쓰시는지는 잘,, 다른분거 본거는 그냥 직접숫자넣었더라구요.
다른분들 쓰신거 고대로 같이 쓰면서 주석도 달텐데요. 혹시 제가 잘못 알고 있는부분은 확실히 지적좀부탁해요.
오토핫키 매크로 베스트팁란의 겜도리님이 공개하신 본문을 보고 배꼇습니다. 이렇게 공개해주신분땜에
첨 접할때 진짜 뭐부터 해야하나 쉽게 갈피를 잡을수 있었네요.
^1::?? ; 컨트롤 +1 클릭시 작동
WinGetActiveTitle, 지니모션? ; 활성화된 윈도우창의 이름을 지니모션이라는 변수에 저장
WinGetPos, x,y,width,height,%지니모션%??? ; 지니모션창의 위치를 x,y,width,height 각 변수에 입력 (세부내용하단)
w:=x+width ; 스크린x값에 지니모션창의 넓이값을더해서 최종 하단우측끝부분 좌표값 획득
h:=y+height ;
WinSet, Alwaysontop,on,%지니모션%? ;지니모션창을 항상위로 셋팅,다른창이 가리면 좌표를 읽어올수없기때문
SysGet, xxx, 32 ; 창의 테두리값을 xxx라는변수에 입력?, 32라는숫자가 테두리를 가리키는듯,
SysGet, yyy, 4 ; 창의 캡션(이름)의 범위를 yyy라는 변수에 입력, 4라는숫자가 캡션을 가리키는듯,
ww:=850+xxx*2 ; 지니모션창은 480*800인데 850인이유는 우측의 기능바(볼륨등있는것)가 50이라서 합친겁니다.
???????????????????????? ;거기에 xxx는 좌우의 지니모션의 얇은테두리입니다. 2개니까 *2
yy:=480+yyy+xxx*2 ; 480에 yyy(캡션창)두께에 더하기 테두리2개 , 여기도 역시 테두리 2개 상하로 있죠.
WinMove ,%지니창% ,,,,%ww%,%yy%? ; 이건 위에서 더한 ww , yy 즉,지니모션창의 우측하던끝부분까지의 범위입니다.
?????????????????????????????????????????????????????? ; 이걸로 지니모션창의 전체크기를 재설정하는거죠.
return? ;^1단축키에 대한 스크립트 종료
위 작업을 함으로써 , 지니모션창을 실수로 크게 키웠다거나, 크기를 변경시켰다면, 다시 원상 복귀가 가능합니다.
아래 본 스크립인데요. 친구선택버튼나오는부분만 일부 예제로 하겠습니다.
x,y,w,h의 값은 위에서 이미 변수에 넣어놓은 값들입니다.
F1::
CoordMode, pixel, screen ; 스크린방식으로 픽셀을 찾습니다.
Loop { ; 전체 반복 루프시작
ImageSearch, vx,vy,%x%,%y%,%w%,%h%, *50 img\친구선택메인.png ;현재위치가 친구선택위치인지 구분
if (errorlevel=0){ ?;친구선택위치인 경우
?ImageSearch,vx,vy,%x%,%y%,%w%,%h%, *50 img\친구선택버튼.png? ;친구선택버튼 켜진이미지 찾음
?if (errorlevel=0){ ;이미지 켜졌으면
??gosub,클릭 ; '클릭' 이라는 라벨을 실행한후 다시?이리 돌아옴
??sleep 500
?}
?ImageSearch,vx,vy,%x%,%y%,%w%,%h%, *50 img\입장하기.png ;?위 친구선택버튼켜졌으면클릭후 입장찾음
?if (errorlevel=0){ ;입장하기?이미지 찾았으면
??gosub,클릭 ; 클릭 라벨 실행후 다시 돌아옴.
??sleep 500
?}
}
----생략
} ;루프끝
클릭:
px:=vx - x -7 + 5? ; vx좌표에서-x(스크린상에서 지니모션창 시작x값) -7(창의테두리값xxx와같음) + 5(추가범위)
py:=vy - y - 30 +5 ; vy좌표에서-y(스크린상에서 지니모션창 시작y값) -30(창의캡션23에테두리7) + 5(추가범위)
pm:=px|py<<16 ; 포스트메시지에 쓰는 값, 16비트 형식으로 변경
PostMessage, 0x201, 0, %pm%,,%지니창% ; 0x201은 마우스를 클릭하고 때지않은상태 down과 같음
PostMessage, 0x202, 0, %pm%,,%지니창% ; 0x202은 마우스를?땐 상태,?up과 같음
return
기본적으로 이미지를 찾고 그 이미지의 x,y좌표보다 +5만큼 더해서 그 이미지부분을 클릭하게 되어있구요..
별도로 마우스좌표를 직접입력하여 클릭하는 부분은 아래처럼 해뒀네요.
ImageSearch, vx, vy, %x%, %y%, %w%, %h%, *5 img\동료획득.png? ;동료획득부분인지 확인후
if (errorlevel=0){
?x1:= x + 341 ; 동료획득버튼 나오는부분 범위를 지정하고 있어요. (가끔못찾길래 범위를 정해서 서치하는방식으로)
?y1:= y + 440 ; 각각 스크린좌표인 x, y에?이미지좌표인 relative 좌표를 더해서 스크린방식으로 이미지좌표를
?w1:= x + 480 ; 변수에 저장합니다
?h1:= y + 473
?ImageSearch, vx, vy, %x1%, %y1%, %w1%, %h1%, *50 img\동료획득버튼.png ; 버튼 있나확인 ,확실히하기위해
?if (errorlevel=0){
??xs:=406 ; 이것역시 버튼 좌표를 직접?relative값으로 xs , xy라는 변수에 저장하고 있어요.
??ys:=461
??gosub, 클릭s? ; 클릭s라는 라벨실행후 돌아옵니다.
??sleep 200
?}
}
클릭s:
px:=xs -7 ; 위에서 직접 지정한 relative x값에 테두리값 7을 뺀값을 px변수에 저장합니다.
py:=ys - 30 ; 마찬가지로 , 캡션값23과 , y테두리값7더한 30을 빼고 py변수에 저장합니다.
pm:=px|py<<16
PostMessage, 0x201, 0, %pm%,,%지니창%
PostMessage, 0x202, 0, %pm%,,%지니창%
return
제가 하는 방식이 , 좀 복잡한거 같아요.. 제가 볼때도 가끔보면 헷갈릴 판이에요. 지저분해요..
이렇게 머리 아프게 된게 , 포스트메시지는 스크린방식으로 작동하는데,, 문제는 지니모션의 테두리등을 인식안하니
테두리 캡션 다 빼줘야해서 거기서 , 일반 스크린방식과 차이가 발생하니까 그걸 염두에 둬야한다는게 짜증이네요.
그래서 , 좀더 x,y값을 쉽게 입력하려고 , 라벨로 두가지로 햇네요.
하나는 , 이미지좌표에서 +5더한 곳 클릭하고,
또하나는, 이미지좌표가 아닌 마우스로 클릭해야할 좌표를 직접 입력해서 바로 테두리캡션뺀값 포스트메시지클릭하게요.
볼때마다 좀 지저분해서 , 이거 좀 어떻게 좀 다르게 할수 없나 싶어서요.
혹시 다른분들은 어떤식으로 하는지 궁금합니다.
지저분하게 글을 썼는데 읽느라 고생하셨네요..
이미지서치 명령어에 vx vy 부분에, 찾은이미지의 좌측상단 끝부분의 좌표가 나오잖아요?
친구선택 버튼이미지를 이미지서치로 찾고나서 vx vy 좌표를 x축 양의방향, y축 음의방향으로 약간 조정해준 뒤 조정한 좌표를 포스트메시지에 넣어서 클릭하게 하는건 어떤가요?
그럼 굳이 테두리크기나 캡션크기를 계산하지 않아도 될것 같은데...
제가 비활성을 안써봐서 이렇게도 동작이 될지는 모르겠네요 ㅋㅋㅋ