오토핫키 커뮤니티

조회 수 6819 추천 4 댓글 11



일단 관련글들이 있으나 , 부분부분있기때문에 제가 얼마동안 이것저것 해본것들을 정리도해볼겸

자유게시를 합니다.

내용은 거의 모두 현 게시판에서 질답으로 제가 질문드린 내용들에 대해 답변을 주신것들입니다. 모두감사요
(답변주신분들 열거하려다가, 이게뭐라고 생각되어 궁금하신분들은 그냥 검색해보세요.)


혹시 보시고 틀린 부분이나 , 이렇게 하면 더 좋다는 부분은 말씀주시면 고맙겠습니다..^^



#Include Gdip.ahk
#Include Gdip_ImageSearch.ahk


F4::

WinGetActiveTitle,Title
RegExMatch(Title,"(\d{3}\.\d*\.\d*\.\d*)",b)
ip="%b%:5555"

SysGet, border, 32
SysGet, caption, 4
count:=
return



F1::

if (GSearch("이미지이름")) ;찾을이미지이름,따옴표로묶음.png생략 ex: abc.png ,기본 전체이미지,검색률80

{

?? GTouch() ; 위에서 찾은 이미지 터치

}

;======================

; 이미지 찾을 좌표 범위지정시

if (GSearch("이미지이름",10,10,30,30,100,0x000000))? ; 0x000000 은 블랙 투명처리,생략해도됨

??????????????????????????????????????????????????????????????????????? ;if (GSearch(이미지이름,10,10,30,30))

{

?? GTouch() ; 위에서 찾은 이미지 터치

}

;=======================

;윈도우스파이를 보고 좌표직접입력 터치

Touch(50,50) ; 단점 adb 명령어를 이용하기 때문에 터치속도가 현저히느리다.

;=======================

PTouch(50,50) ; 포스트메시지터치,빠르게 터치가능


return


;========================함수처리

GSearch(img,gx=0,gy=0,gw=0,gh=0,per=80,trans="") ; 이미지명,x,y,w,h좌표,per검색률,trans투명처리
{
global ip,bmpHaystack,bmpNeedle,border,caption,vx,vy
RunWait, adb.exe -s %ip% shell screencap -p /sdcard/bg.png,,hide
RunWait, adb.exe -s %ip% pull /sdcard/bg.png,,hide

; 오토잇윈도우스파이로 좌표입력했을때 기준

if (gx != 0)
gx := gx - border
if (gy != 0)
gy := gy - border - caption
if (gw != 0)
gw := gw - border
if (gh != 0)
gh := gh - border - caption
gdipToken := Gdip_Startup()
bmpHaystack := Gdip_CreateBitmapFromFile("bg.png")
Gdip_ImageRotateFlip(bmpHaystack, 3) ;------ 같은화면에서 여러이미지 찾을시 이부분까지 편집수정필요

bmpNeedle := Gdip_CreateBitmapFromFile("img\"img ".png")
RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,GXY,gx,gy,gw,gh,per,trans,1,1)

Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(gdipToken)
StringSplit,gxy,GXY,`,
vx :=gxy1
vy := gxy2
IF (RET)
{
?return true
}
}


Touch(adbx,adby) ; 윈도우스파이좌표입력기준 터치
{
global ip,border,caption
x := adbx - border
y := adby - border - caption
RunWait, adb.exe -s %ip% shell input tap %x% %y%,,hide
Sleep, 200
}


GTouch() ; 찾은이미지 터치
{
global ip,gxy
StringSplit,xy,gxy,`,
RunWait, adb.exe -s %ip% shell input tap %xy1% %xy2%,,hide
Sleep, 200
}


PTouch(px,py) ; 윈도우스파이좌표기준, 포스트메시지터치
{

global Title,ip,border,caption
px :=?px - border
py :=?py - border - caption
pm:=px|py<<16
PostMessage, 0x201, 0, %pm%,,%Title%
PostMessage, 0x202, 0, %pm%,,%Title%
Sleep,10
}


esc::

Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(gdipToken)
EXITAPP




정리해보면 , 위 방식은 adb에서 캡쳐한파일을 pc로 가져와서 그 파일을 기준으로 서칭하는방식이라

속도가 상당히 느린편입니다.

일반적으로 한 화면내에서 한번 이미지서칭시에는 속도가 1초정도 느려도 감내할수있으나,

한화면에서 여러이미지를 수십번 검색하거나, 피게이지처럼 실시간 감시할경우 느려서 힘듭니다.

이런?한화면내 루프서칭시?adb캡쳐를 수정하셔야합니다.

처음에 한번만 캡처부분을 해주시고, 다음 루프부터는 찾을이미지서칭만 해야합니다.

그래야 중복해서 같은 배경이미지를 계속 캡쳐하지 않겠지요.


그래도 1초이상의 지연은 어쩔수가 없더군요. 제가 하던 coc 자원서칭의 경우는

한 화면에서 서칭이 20번이상이루어지기때문에 , 한컷당 2초이상소모가되어버리네요.(adb캡처1~1.5초,서칭1초)

이문제를 해결하려면 역시 , 블루스택에 disp를 쓰는게 나은거 같습니다.? (이부분은 검색하면나옵니다)

블루스택이 지니모션보다 편의상(?) 좀 안좋은게 탈이에요.


위 방식 사용시 단점 : 속도 , 이미지파일 디스크에 쓰고지우기 반복으로 인한 소모?

장점 : 화면 가리거나,투명화, 화면크게 작게 해도 지장없이 서칭이 가능(작업표시줄 최소화는 안됨)

???????? (화면안보이는곳으로 보낸다거나 하는 팁은 매크로맨서님 글이 잇을겁니다.)


================

대략 여기까지이며 , 제가 궁금한부분이 있는데 , 어느정도 짐작하는 부분입니다.


아직 함수사용이 미숙하여 애매한 명령어들이 있습니다.

global 지정할 경우 함수내외에서 지정한 변수를 사용할수 있게되는것으로 압니다.

global지정을 여러개 할 경우 중복된 처리로 꼬일거 같은 느낌이 드네요.


disp명령어에서 메모리할당된 이미지 삭제 부분인데요.

위 소스에서 보듯이 잴하단부에?종료시 Gdip_DisposeImage로 메모리할당된 이미지를 삭제처리해두었습니다.

이 경우, 이미지변수 역시 global지정을 해야할까싶네요. 제가 테스트해본결과 global지정을 안하면 이미지인식이

안되더군요. 아래처럼 해야하는것인지 모호하네요.

clear()

{

global bmpHaystack,bmpNeedle? ; global 선언을해야하는가
Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(gdipToken)

}


또한 한 화면내 여러이미지 서칭시 gdipToken := Gdip_Startup() 한번 주고 서칭을 반복할때는 넣지않고

이후 마지막 클리어할때 아래처럼 Gdip_Shutdown(gdipToken) 해도 되겠죠?

현재 여러 이미지 루프서칭시 한이미지서칭끝날경우 별도로 Gdip_DisposeImage(bmpHaystack)로 그때그때

메모리에서 찾을이미지를 삭제해주고있습니다.


위 소스에는 참조변수인 byref는 사용하지 않았는데요.

본문에서 함수쓸때 타이핑 최소화를 위해서 byref를 global로 대체를 하였는데 왠지 꼬일까 불안하네요.




참고 하실분들은 참고 하시고 , 제질문꼼꼼히 답변주셧던 분들감사드립니다.




  • profile
    키리코 2015.05.05 10:27
    와 코드 대단하시네요... 저도 이런거 배우지만 어렵네요
  • 매크로맨서 2015.05.06 15:47

    일단 검색시간이 1초가 넘어가는 이유는 지금 cmd 이용방식을 지적해드리고싶네요

    지금 방식은 검색시마다 cmd 창을 열고 닫고 반복하시니까 여기서 지연이 발생합니다

    테일스타에서 표준화된 800 480 화면을 캡쳐해서 에뮬에서 pull 하고

    gdip_imagesearch 까지 하는데 절대 1초까지 나올 이유가 없습니다

    제 매크로의 경우 정보가 적은 화면은 300ms 많은 화면은 600 ms 정도 평균으로 잡힙니다

    아래 코드는 콘솔창 하나를 띄우고 숨긴 후 이후 모든 명령을 이 창 하나에서 해결하는 방법입니다


    #Persistent
    OnExit, Clean_up

    Attach:
    DetectHiddenWindows, on
    Run, %comspec% /k ,,Hide UseErrorLevel, cPid
    WinWait, ahk_pid %cPid%,, 10
    DllCall("AttachConsole","uint",cPid)
    hCon:=DllCall("CreateFile","str","CONOUT$","uint",0xC0000000,"uint",7,"uint",0,"uint",3,"uint",0,"uint",0)
    objShell := ComObjCreate("WScript.Shell")
    return


    Clean_up:
    DllCall("CloseHandle", "uint", hCon)
    DllCall("FreeConsole")
    Process, Close, %cPid%
    ExitApp


    콘솔에 명령을 보내는 방법은
    objExec := objShell.Exec(명령)


    그런데 이렇게만 하면 명령만 보내고 작업이 끝났는지 알수가 없습니다. 따라서 아래의 코드를 추가합니다

    strStdOut:=strStdErr:=""
    while, !objExec.StdOut.AtEndOfStream
    ???? strStdOut := objExec.StdOut.ReadAll()
    while, !objExec.StdErr.AtEndOfStream
    ???? strStdErr := objExec.StdErr.ReadAll()


    결과를 모니터링 하려면 아래 코드도 써줍니다

    MSGBOX,4096,, OUT:`n[`n%strStdOut%]`n`nERROR:`n[`n%strStdErr%]


    참고로 adb pull 명령의 실행 결과는 error 값으로 리턴되기때문에 strStdErr에 저장됩니다

  • 열감기 2015.06.20 11:21
    -----------------------------
    콘솔에 명령을 보내는 방법은
    objExec := objShell.Exec(명령)
    -----------------------------

    에서 명령 부분 좀 자세히 알려 주시면 안될까요?
    테스트로 dir 같은거 하니까.. 에러가 나네요.
  • 매크로맨서 2015.08.19 09:35
    objExec := objShell.Exec("c:\Program Files\BlueStacks\hd-adb -s emulator-5554 shell input tap 850 200")
  • 매크로맨서 2015.05.06 15:59

    그리고 ahk의 경우 함수는 따로 리턴값이 필요한게 아니면 굳이 쓰실 필요가 없습니다

    애초에 매크로를 위해 제작됐기 때문에 gosub, subroutine 을 사용하는게 더 편해요

    global 사용의 번거로움도 줄일 수 있고요 저는 gdip_imagesearch 하나만 함수로 쓰고 있습니다

    x 와 y 좌표만 byref 하고 있고요

  • 매크로맨서 2015.05.06 16:07

    이곳에 올리려다 보니 잘못된 내용일 수도 있지만

    gdip_startup은 이미지서치를 할때마다 하는게 아니라 함수 외부해서 한번만 해주시면 되고

    adb 명령은 이미지서치 함수와는 분리해줄 필요성이 있습니다

    touch 도 에뮬레이터 기준이기때문에 캡션과 보더를 뺄 필요가 없습니다

  • 우후훅 2015.05.06 19:32

    @매크로맨서? cmd를 한번 열고 계속 사용할수 있군요

    adb캡쳐는 체감상 1초정도 걸린다는 말이었습니다. 실제 속도를 체크하거나 한건아니구요.

    cmd콘솔창 여닫는부분의 속도는 생각지못했네요. 한번 해보겠습니다.!!


    ahk리턴값은 타이핑수를 줄이기위한것도 한가지이유입니다.

    리턴 true값이 1이 되니 if ((함수)) 이렇게 간단히 쓸수있는거 같아서요. 그렇지않으면 if errorlevel 체크써줘야해서요

    기존에 gosub로 모든것을 처리했었는데, 일단 함수에 길들이려고 무조건 만드는데 ,몇번해봐서 그런지 오히려

    개인적으로 더 가독성에서 좋은거 같아요.

    adb touch는 따로 테두리 가감하진 않았습니다.


    전반적으로 한번 만든후에 그냥 잘되길래 되나부다 하고 그냥 글을썼었는데?, 하다보니 문법에 문제점이 있더군요

    실제 adb캡처로는 열거된 숫자 서칭에는 무릿수가 있다는걸 느꼈지만, 결론적으로 이런식으로 되는구나 경험으로

    보고 넘어갔습니다.?

    저는 여기까지만 하고 정리할거 같네요. 앞으로도 도움이 되는글 주시면 감사히 보려합니다..;;

  • 메트로홀 2015.05.09 10:44

    좋은정보 감사합니다.

  • 민서s2아빠 2015.05.12 01:24
    오토핫키 너무어려워요 정보잘보고 갑니다
  • 뒹굴그릉 2016.11.04 10:44

    좋은 정보 감사합니다.

  • 빈치우 2017.04.03 14:42

    아... 여럽다..


List of Articles
분류 제목 글쓴이 최근변경 추천
자유 매크로프로그램중 어떤... 3 아우나도쓰자 2015.05.14 0/0
질문 리스트박스에서 리스트 표기설정좀 알려주세요 4 민서s2아빠 2015.05.13 0/0
질문 네뷸라매크로 해상도 레지 1 hhnzxz 2015.05.12 0/0
질문 오토핫키 드롭다운좀 알려주세요 8 민서s2아빠 2015.05.16 0/0
질문 구이매크로 질문드려요 2 쉬르릴 2015.05.12 0/0
질문 listview에서 체크박스 체크상태 유무확인법 4 퉁군 2015.05.14 0/0
질문 진정 테일의 지존분들의 따스한 도움을 기다리고 있습... 13 YOON'S 2015.05.12 0/0
정보 랜덤알파벳출력 1 _Crash 2015.05.11 1/0
질문 메모리 주소의 값변경 3 _Crash 2015.05.18 0/0
질문 오토핫키 파일간 변수 전달 방법 7 퉁군 2015.05.11 0/0
자유 오토핫키 배우고 싶은데 어디서 배워야 할까요? 5 스트릿 2015.09.30 0/0
질문 컴퓨터끼리 변수값좀 받고 싶은데요 4 퉁군 2015.05.11 0/0
자유 등수를 입력하여 해당 내용 불러오기 4 나를대적할자 2015.05.08 0/0
질문 winsock 10051 에러좀 도와주세요~^^; 12 퉁군 2015.05.11 0/0
질문 지니모션에서 오토핫키가 정상작동 하지 않습니다.. 1 um 2015.05.08 0/0
질문 오토핫키 배워보고 싶습니다 (완전초보) 7 강정호 2015.12.28 0/0
자유 매크로 참여 함께하고싶은데.. 10 keil7 2015.05.12 0/0
질문 가능 여부좀 알고싶습니다! 4 다중이 2015.05.11 0/0
자유 폰으로원격제어 하시는분! 14 벚꽃날리는날 2015.05.19 1/0
자유 비활성이미지서치 중간정리(disp,adb) 11 우후훅 2017.04.03 4/0
Board Pagination Prev 1 ... 168169170171172173174175176 ... 209 Next
/ 209

전체 최신 인기글

전체 주간 인기글