오토핫키를 처음 사용하는 초보입니다.
근 한달간 오토핫키 이미지서치하고 mouseclick 명령어를 사용해서 매크로를 만들었습니다.
이번에 비활성화라는 것을 알게되어서 이미지서치까지는 성공했는데 그 다음이 안되고 있습니다.
(최종적으로 녹스에 적용시킬 예정이며, 현재는 테스트하려고 explorer에서 작업중입니다)
screen 좌표 찾아내고
postmessage 명령은 client 좌표여야 한다고 검색에서 배워서 screen좌표를 찾은 것을
수정수정해서 client 값을 가지도록 변수에 저장했는데
문제는 클릭(이동도 마찬가지)이 안됩니다.
도움을 받고싶어서 그림판으로 그린것과 spy, 메시지박스로 출력한 화면도 첨부합니다.
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
#SingleInstance, force
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
SetBatchLines,-1 ; 기본적으로 라인마다 Sleep,10 수행을 제거
ListLines, Off ; 최근 실행된 코드라인 기억
#KeyHistory 0 ; 키로그
; 기본 설정
CoordMode, Pixel, Screen
CoordMode, ToolTip, Screen
global ActiveID, DebugMode, WindowCaptionHeight, WindowBorderWidth, WindowBorderHeight, winX, winY
SysGet, WindowCaptionHeight, 4 ; 캡션Height
SysGet, WindowBorderWidth, 32 ; 보더Width
SysGet, WindowBorderHeight, 33 ; 보더Height
ActiveID := "(주) - Internet Explorer"
DebugMode := 1
Gui, Add, Button, gTestSearch, 이미지 서치
Gui, Add, Button, gTestClick, 이미지 클릭
Gui, Add, Button, gRestart, 재시작
Gui, Show, , 테스트
Return
GuiClose:
ExitApp
Return
TestSearch:
; 기본 서치
MsgBox, % CheckImage( "test.bmp")
Return
TestClick:
; 기본 클릭 테스트
;MsgBox, % ClickImage( "test.bmp")
MsgBox, % ClickImage( "test.bmp")
Return
Restart:
Reload
Return
; 이미지 서치
; seconds : 시간 지정 (기본설정상 1초 = 10번 시도, 0.5초 = 5번 시도함)
; imgX, imgY : 리턴받기 위해 사용
; fromX , fromY , toX , toY : 이미지 서치 범위 지정
; 리턴값 : 1 = 이미지 찾음 , 0 = 이미지 못찾음, -1 = 이미지 파일 없음
CheckImage(img, seconds=0, ByRef imgX="", ByRef imgY="", fromX=0, fromY=0, toX=0, toY=0) {
global ActiveID, DebugMode
Sleep, 10
If ( ActiveID)
WinGetPos, winX, winY, winW, winH, % ActiveID
Else
winX := 0, winY := 0, winW := A_ScreenWidth, winH := A_ScreenHeight
sleepTime := 100
times := seconds * (1000 / sleepTime)
If ( times=0)
times := 1
x := winX, y := winY, w := winX+winW, h := winY+winH
If (fromX && fromY && toX && toY)
{
w := x+toX, h := y+toY, x := x+fromX, y := y+fromY
If ( DebugMode = 1)
{
ToolTip, 범위시작, x, y, 11
ToolTip, 범위끝, w, h, 12
}
}
Loop, %times%
{
ImageSearch, oX, oY, x, y, w, h, *50 %A_ScriptDir%\%img%
If ( ErrorLevel = 0)
{
imgX := oX
imgY := oY
msgbox, imgx : %imgx% imgy : %imgy%
If ( DebugMode = 1)
{
;ToolTip, %img%, imgX, imgY, 10
}
Return 1
}
Else If ( ErrorLevel = 2)
{
MsgBox, , , 이미지 없음 : %img% , 1
Return -1
}
Sleep, %sleepTime%
}
Return 0
}
; 비활성 이미지 클릭
; seconds : 시간 지정 (CheckImage 설정에 따름)
; fromX , fromY , toX , toY : 이미지 서치 범위 지정
; 리턴값 : 1 = 이미지 찾음 , 0 = 이미지 못찾음, -1 = 이미지 파일 없음
ClickImage(img, seconds=0, fromX=0, fromY=0, toX=0, toY=0) {
Sleep, 10
result := CheckImage( img, seconds, x, y, fromX, fromY, toX, toY)
If (result = 1)
{
px:=x-winX-WindowBorderWidth ;;370 확인
py:=y-winY ;-WindowBorderHeight-WindowCaptionHeight ;;295 수동으로 맞춤
msgbox, x:%x%, y:%y%, winx:%winx%, winy:%winy%, WindowCaptionHeight:%WindowCaptionHeight%, WindowBorderWidth:%WindowBorderWidth%, WindowBorderHeight:%WindowBorderHeight%, clientx:%px%, clienty:%py%
p := px|py<<16
If ( DebugMode = 1)
{
;ToolTip, 이미지 클릭 %img%, x, y, 10
}
PostMessage, 0x200, 0, px|py<<16, , %ActiveID%
;PostMessage, 0x200, 0, %p%, , %ActiveID% ;마우스 이동안됨
;PostMessage, 0x201, 1, %p%, , %ActiveID% ;마우스 누르기 안됨
;PostMessage, 0x202, 0, %p%, , %ActiveID% ;마우스 뗴기 안됨
}
Sleep, 200
Return result
}
[좌표]
[spy ]
[메시지출력]
연구를 많이 하신것 같군요.
윈도우 인포에서 보여지는 것만으로도 잘못된 점을 아실수 있는데 간과하신점이 아쉽습니다.
x축-보더값은 8로서 x값에서 8을 빼주면 맞지만 y축-캡션,보더값은 둘다 0 입니다.
그럼 답은 나왔지요?
y축값에서 캡션과 보더값은 빼지 않으면 됩니다.
그런데 찾은 이미지의 좌상값이므로 그 지점을 직접 클릭해보세요. 해당 전체 이미지의 살짝 안쪽이라면 상관없겠으나
너무 끝쪽이라면 클릭이 되지 않을수도 있습니다.
그리고 마우스 이동이 안된다고 느끼시는건 코드도 살짝 틀렸지만
해당 윈도우에서 내부적으로 이동하는 것이기 때문에 실제 사용중인 마우스 커서의 이동은 없습니다.
; 0x200, 1, ~ (0으로 했을시 유틸에 따라 먹히지 않을수도 있습니다)
노력이 엿보이는 질문이라서 잘못된 점을 추가로 알려 드립니다.
공개된 코드중 자신이 쓰던 유틸(대부분 에뮬이겠지요?)을 상대할때 에러가 없다는 판단하에 올린것이겠지만
세부적으로 따지면 틀린점들이 한두군데씩 보입니다.
그러므로 정확히 이해하시고 사용하는게 나중을 위해서라도 좋습니다.
SysGet, WindowCaptionHeight, 4 ; 캡션Height
SysGet, WindowBorderWidth, 32 ; 보더Width
SysGet, WindowBorderHeight, 33 ; 보더Height
위에서 SysGet으로 보더 캡션값을 구했지만 이 값은 무엇을 근거로 나온 값일까요?
이 값은 윈도우즈의 시스템값일뿐 유틸에서 해당값을 바꿔 버렸다면 사용해선 안되는 값입니다.
P.S 그럼, 어떻게 해야 해당 윈도우의 정확한 값을 알아낼까요?
.
.
.
.
.
.
.
.
.
.
.
.
답은 다음 기회에....
고민해보시기 바랍니다. 어렵지 않습니다.
아아..참...갠적으로 닉네임은 맘에 들지 않습니다 -_-;;