비활성메크로 만들어볼려고 모바게님 함수로 공부중인데요
아이콘 클릭하고 공지사항까지는 진행되는데
팝업창을 찾아서 좌표클릭하게 했더니 위 사진처럼?
마우스 포인터 우측 하단위치에 좌표클릭 이라고만 뜨고 클릭이 안됩니다.
마우스 포인터가 블루스택 밖에있으면 그곳에 좌표클릭이라고 뜨고요
그리고?
if(CheckImage( "\raven\error\팝업창.bmp")=1) ; 팝업창.bmp 이미지를 찾았다면
? {
? ?ClickPosition(679, 417) ; X, Y 좌표를 클릭해라
? }
위에 행동을 하면 팝업창이 안뜰때까지 반복하는건가요?
?waitImageClick("\raven\error\확인.bmp")?전에 팝업창이 몇번발생해서 팝업창이 안뜰때까지?
반복하게 해야하거든요
;==================실행=========================
#NoEnv ?; Recommended for performance and compatibility with future AutoHotkey releases.
coordmode, pixel, screen
#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
ListLines, Off
ActiveID := "BlueStacks App Player"
DebugMode := 1
실행:
?waitImageClick("\raven\error\아이콘.bmp")
?waitImageClick("\raven\error\공지사항.bmp")
?if(CheckImage( "\raven\error\팝업창.bmp")=1) ; 팝업창.bmp 이미지를 찾았다면
? {
? ?ClickPosition(679, 417) ; X, Y 좌표를 클릭해라
? }
?waitImageClick("\raven\error\확인.bmp")
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
? ? ? ? ? ? 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)
? ? {
? ? ? ? global ActiveID, DebugMode, WindowCaptionHeight, WindowBorderWidth, WindowBorderHeight
? ? ? ? WinGetPos, winX, winY, winW, winH, % ActiveID
? ? ? ? px:=x-winX-WindowBorderWidth
? ? ? ? py:=y-winY-WindowBorderHeight-WindowCaptionHeight
? ? ? ? p := px|py<<16
? ? ? ? If ( DebugMode = 1)
? ? ? ? {
? ? ? ? ? ? ToolTip, 이미지 클릭 %img%, x, y, 10
? ? ? ? }
? ? ? ? PostMessage, 0x201, 0, %p%, , % ActiveID
? ? ? ? PostMessage, 0x202, 0, %p%, , % ActiveID
? ? }
? ? Sleep, 200
? ? Return result
}
; 비활성 좌표 클릭
; x, y 좌표를 클릭
ClickPosition(x, y) {
? ? global ActiveID, DebugMode, WindowCaptionHeight, WindowBorderWidth, WindowBorderHeight
? ? Sleep, 10
? ? px:=x-WindowBorderWidth/2
? ? py:=y-WindowBorderHeight/2-WindowCaptionHeight
? ? p := px|py<<16
? ? PostMessage, 0x201, 0, %p%, , % ActiveID
? ? PostMessage, 0x202, 0, %p%, , % ActiveID
? ? If ( DebugMode = 1)
? ? {
? ? ? ? WinGetPos, winX, winY, winW, winH, % ActiveID
? ? ? ? ToolTip, 좌표클릭, winX+px, winY+py, 10
? ? }
? ? Sleep, 200
? ? Return 1
}
; 비활성 마우스 드래그
; (fromX, fromY) 좌표에서 (toX, toY) 로 드래그함
MouseDrag(fromX, fromY, toX, toY) {
? ? global ActiveID, DebugMode, WindowCaptionHeight, WindowBorderWidth, WindowBorderHeight
? ? Sleep, 10
? ? px1 := fromX-WindowBorderWidth/2
? ? py1 := fromY-WindowBorderHeight/2-WindowCaptionHeight
? ? p1 := px1|py1<<16
? ? px2 := toX-WindowBorderWidth/2
? ? py2 := toY-WindowBorderHeight/2-WindowCaptionHeight
? ? p2 := px2|py2<<16
? ? PostMessage, 0x201, 0, %p1%, , % ActiveID
? ? PostMessage, 0x200, 0, %p2%, , % ActiveID
? ? PostMessage, 0x202, 0, %p2%, , % ActiveID
? ? If ( DebugMode = 1)
? ? {
? ? ? ? WinGetPos, winX, winY, winW, winH, % ActiveID
? ? ? ? ToolTip, 드래그시작, winX+px1, winY+py1, 11
? ? ? ? ToolTip, 드래그종료, winX+px2, winY+py2, 12
? ? }
? ? Sleep, 200
? ? Return 1
}
;이미지 서치
imageSearcher( ByRef imgX, ByRef imgY, img)?
{
? ? global ActiveID
? ? WinGetPos, winX, winY, winW, winH, %ActiveID%
? ? ImageSearch, oX, oY, winX, winY, winX+winW, winY+winH, *50 %A_ScriptDir%\%img%
? ? If ( ErrorLevel = 0)
? ? {
? ? ? ? imgX := oX
? ? ? ? imgY := oY
? ? ? ? return 1
? ? }
? ? else If ( ErrorLevel = 1){
? ? ? ? return 0
? ? }
}
;클릭
sendClick( x, y) {
? ? global ActiveID
? ? WinGetPos, winX, winY, winW, winH, %ActiveID%
? ? SysGet, capH, 4 ; 캡션Height
? ? SysGet, bordW, 32 ; 보더Width
? ? SysGet, bordH, 33 ; 보더Height
? ? px:=x-winX-bordW
? ? py:=y-winY-bordH-capH
? ? p := px|py<<16
? ? PostMessage, 0x201, 0, %p%, , %ActiveID%
? ? PostMessage, 0x202, 0, %p%, , %ActiveID%
? ? Sleep, 200
? ? Return
}
sendClick2( x, y)?
{
? ? global ActiveID
? ? SysGet, capH, 4 ; 캡션Height
? ? SysGet, bordW, 32 ; 보더Width
? ? SysGet, bordH, 33 ; 보더Height
? ? px:=x-bordW/2
? ? py:=y-bordH/2-capH
? ? p := px|py<<16
? ? PostMessage, 0x201, 0, %p%, , %ActiveID%
? ? PostMessage, 0x202, 0, %p%, , %ActiveID%
? ? Sleep, 200
? ? Return
}
;서치앤클릭
imageSearchClick(img)?
{
? ? If imageSearcher( x, y, img) = 1?
? ? {
? ? ? ? sendClick( x, y)
? ? ? ? Return 1
? ? }
? ? Return 0
}
;이미지 찾을때까지 대기
waitImage(img) {
? ? Loop {
? ? ? ? If imageSearcher( x, y, img) = 1?
? ? ? ? {
? ? ? ? ? ? Break
? ? ? ? }
? ? ? ? Sleep, 500
? ? }
? ? Sleep, 200
? ? Return
}
;이미지 찾을때까지 대기후 클릭
waitImageClick(img) {
? ? Loop {
? ? ? ? If imageSearchClick( img) = 1
? ? ? ? {
? ? ? ? ? ? Break
? ? ? ? }
? ? ? ? Sleep, 500
? ? }
? ? Sleep, 200
? ? Return
}
반복을 하려면 루프를 돌리시면 되겠죠.
1. 팝업 있는지 검사한다.
2.1 팝업이 있으면 팝업을 닫는다 -> 다시 1번으로
2.2 팝업이 없으면 팝업을 닫은 후 나오는 화면(예를들면 메인) 이 있는지 검사한다
3.1 메인이 있으면 루프탈출
3.2 메인이 없으면 다시 1번으로