F2::
{
매크로시작:= true
while(매크로시작= true)
{
CoordMode, Pixel, Screen
WinGetPos, pos_x, pos_y, width, height, test
x_right := width + pos_x
y_bottom := height + pos_y
Imagesearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *100 C:\Image\1.bmp
if (ErrorLevel = 0)
{
msgbox,1인식완료
내부좌표클릭(FoundX, FoundY)
Sleep, 1000
}
Imagesearch, FoundX, FoundY, %pos_x%, %pos_y%, %x_right%, %y_bottom%, *100 C:\Image\2.bmp
if (ErrorLevel = 0)
{
msgbox,2인식완료
내부좌표클릭(FoundX, FoundY)
Sleep, 1000
}
}
}
return
내부좌표클릭(xx, yy)
{
CoordMode, Pixel, Screen
WinGetPos, w_x, w_y, w_w, w_h, test
내부좌표x:= xx - w_x
내부좌표y:= yy - w_y
Iparam := 내부좌표x|내부좌표y<<16
PostMessage, 0x201, 1, %Iparam%, DirectUIHWND3, test
Postmessage, 0x202, 0, %Iparam%, DirectUIHWND3, test
Sleep, 1000
}
F3::
{
매크로시작:= false
}
return
---------------------------------------------
"test"는 test폴더이고, 그 안에 각각 두개의 아이콘이 있으며(각각의 캡쳐본은 1.bmp / 2.bmp), 클릭을 번갈아가면서 하는 스크립트를 짜봤습니다.
기대완 달리 비활성화 상태에서 이미지 인식까지는 잘 되는 것 같은데(메시지박스 정상적으로 출력), 그 뒤로 클릭은 되지 않네요.
window spy 프로그램을 이용해 test폴더의 control 값(Class NN)도 찾아서 지정해줬는데도 영 먹통이네요.
이미지서칭이 잘 된거보면 내부좌표클릭 함수 부분에서 문제가 있는 것 같은데 아무리 들여다봐도 모르겠습니다.
어느 부분이 문제인지 알 수 있을까요?
좌표는 스크린,윈도우,클라이언트 3가지가 있습니다.
이미지서치에 스크린을 이용하였고, 클릭함수에서 윈도우의 위치를 빼셨으니 윈도우 좌표가 되었습니다.
그러나, 포스트메시지는 클라이언트 좌표를 사용합니다.
윈도우좌표에서 테두리(보더), 창제목(캡션)을 빼줘야 클라이언트 좌표가 됩니다.
sysget, cap, 4 ;제목
sysget, bor, 32 ;테두리
클래스를 지정한다면 또다른 문제가 제기됩니다.
클래스가 윈도우안에 포함되어 좌표가 계산되어진다면 상관없지만
유틸이 클래스를 별도로 운영해서 동작되어질 경우,
해당 클래스의 좌표는 윈도우와 상관없이 별도의 영역으로 인식하고 좌표를 주어야 합니다.
또한, 오동작을 막기위해 클래스가 활성이 되어야만 동작되는 것도 있습니다.
포스트메시지로 클릭이 안된다면 controlclick 으로 시도해 보세요.