다운은 여기에서
----------------
양심 찔려서 막음.2016.08.17.15:54
----------------
구글 검색 방지로 제목을 저렇게 하였구요.
녹스에서 사용하는 gdip 기반 비활성 이미지 서치입니다.
저도 처음엔 ADB로 제작하려고 하였으나 속도가 생각보다 너무 느려 여기저기 검색해서 만들어보았습니다.
화면 해상도는 800*500 DPI 60입니다. 어차피 사이즈 안 맞으면 꺼지게 코딩해두었습니다. 어차피 안되거든요.
DPI는 맞춰주시는게 이롭지 않을까 싶어요. 노트북에서 제작하는 와중 DPI를 높이니 하도 힘들어해서 내리고 했거든요..
또 녹스가 OPENGL옵션으로 실행되있으면 안돌아가게 해놨어요. 메세지가 하나도 안 뜬다면 정상적으로 작동될거란 신호입니다.
메인으로 제작한 코드는[ 8월 10일의 시도.ahk ]입니다. 요걸 참고하시면 되요.
프로그램의 기능은 레이드매크로 전반적인 부분과 더불어 휴대폰으로 확인할 때 편하라고 자동로그인도 넣어두었어요.
레이드 화면에서 눌러야 작동이 됩니다. 다만 자동로그인 기능은 녹스 실행시 공지부분에서 다음부터 안보겟다 체크하는건 다 수동으로 제껴야해요. 넣는걸 깜빡했어요..그리고 겸사겸사 토벌대 전복방지용 자동래디 / 빠른 다음시작 기능을 넣기도 했어요.
또, 녹스에서 오토핫키를 특히 비활성 이미지 서치로 사용하고자 하시는 분께 당부말씀 드리자면
초기 실행시 녹스는 OPENGL 방식이라 스크린캡쳐시외엔 이미지 서치로 사용하기 어렵습니다
즉, 비활성 서치로 구동할 수 없는거죠. 이거 때문에 검색와중에 OPENGL에서 사용가능하게끔 하는 관련 라이브러리를 검색하였지만 사용하는건 제 능력 밖의 일이라 느껴져서 포기하고 다른 길을 찾았어요. 첨부파일 안에 OPENGL라이브러리를 함께 첨부하였습니다. 사용하실 분은 사용하시고 사용법을 가르쳐주시는걸 부탁드릴게요. 아무튼 제가 찾은 해결방법은 설정에서 Direct모드로 바꿔주는 거엿죠.
그리고 Direct모드로 하게되면 잘 돌아갑니다. 다만 문제가 있는게 사이즈가 제멋대로 설정되고 해상도가 제 멋대로 설정되는 등 몇 번의 녹스 재부팅이 필요합니다.
개인적 소감으로 김영감님이라고 펀땡땡에 있으시는 분은 EKM_lib라고 따로 녹스나 미뮤용 라이브러리를 제작하였다는데 한번 보고싶네요. ADB를 안쓰고 gdip기반 라이브러리 만으로 비활성 서치 부분을 가능하다 하시니 언제고 여유가 된다면 참고하시길 바랄게요.
그리고 코드설명에 대한 코멘트입니다. 제일 먼저 말씀드릴 건 코드 정리가 안된 부분이 많아요.
주된 함수는 Gclick과 Gsearch인데
Gsearch에서 쓸데없는 부분은 지우시고 하시면 됩니다. 아래 지운걸 올려요. adb로 하려던 흔적들이 남아있네요.
Gsearch("x.png",vx,vy)
로 사용하고 이미지를 찾을 경우 true값을 반환하며 vx와 vy에 해당 좌표를 저장합니다.
실패할 경우 false값을 반환하며, true와 false는 화면 체크 등에 유용하게 쓰입니다.
if(gsearch("a.png",vx,vy) = true and gsearch("a.png",vx,vy) = false or gsearch("c.png",vx,vy)=true)
이런식으로 조건문을 달 수 있는거죠.
Gclick("x.png")로 사용하고 그냥 클릭하는 기능입니다.
물론 vx와 vy를 global 선언(보통은 없어지지만 선언할 시 전 영역에 같이 쓰이는 변수로 선언) 하게되면
controlclick으로도 할 수 있지만 보기편하려고 Gclick으로 만들었어요.
그리고 함수 호출 내에서 gui를 수정하게끔 해서 매크로 제작시 어디서 멈추었는지 확인하기 쉽게 끔 했습니다. 저편하자고 넣은 기능인데 이게 또 은근 보는 맛은 있더라구요.
주석으로 달려있는 것 중에
;Gdip_SetBitmapToClipboard(pBitmapHayStack) 은 클립보드로 보내는겁니다. 제작시 스크린샷이 필요한 경우가 많잖아요? 이걸 넣고 하게되면 오류가 난 곳에서 빙빙 돌고 있을 텐데 그대로 그림판 여셔서 붙여넣기 하시면 됩니다. 다만 매크로가 켜져있을 경우엔 일반적인 복붙이 안되서 그냥 주석처리 해두었어요.
나머지 잔재들은 사용자에게 무슨 문제가 생겼는지 알려주게끔 하려고 사이즈 체크, 최소화 여부 등등을 추가했어요. 이게 정답이다 말할 수 없어서 그냥 참고하시길 바랍니다.
사용후 피드백과 첨언은 언제고 받습니다.
수고하세요. 스크립타 제작자 S.bam.23 올림
;------
Gsearch(image, byref vx, byref vy)
{
winget,hwnd,,ahk_exe Nox.exe, QWidgetClassWindow
pToken:=Gdip_Startup()
pBitmapHayStack:=Gdip_BitmapFromhwnd(hwnd)
pBitmapNeedle:=Gdip_CreateBitmapFromFile(image)
;Gdip_SetBitmapToClipboard(pBitmapHayStack)
if Gdip_ImageSearch(pBitmapHayStack,pBitmapNeedle,list,0,0,0,0,60,,1,1)
{
StringSplit, LISTArray, LIST, `,
vx:=LISTArray1
vy:=LISTArray2
errorlevell:=0
Gdip_DisposeImage(pBitmapHayStack), Gdip_DisposeImage(pBitmapNeedle)
Gdip_Shutdown(pToken)
;msgbox true return
guicontrol , , Status_text, Find %image%
Sleep,100
return true
}
else
{
errorlevell:=2
Gdip_DisposeImage(pBitmapHayStack), Gdip_DisposeImage(pBitmapNeedle)
Gdip_Shutdown(pToken)
guicontrol , , Status_text, fail %image%
;msgbox false return
erro_check:=errocke+1
Sleep,100
return false
}
}
Gclick(image)
{
;winget,hwnd,,ahk_exe Nox.exe, QWidgetClassWindow
pToken:=Gdip_Startup()
pBitmapHayStack:=Gdip_BitmapFromhwnd(hwnd)
pBitmapNeedle:=Gdip_CreateBitmapFromFile(image)
;Gdip_SetBitmapToClipboard(pBitmapHayStack)
sleep, 150
if Gdip_ImageSearch(pBitmapHayStack,pBitmapNeedle,list,0,0,0,0,60,,1,1)
{
StringSplit, LISTArray, LIST, `,
vx:=LISTArray1
vy:=LISTArray2
sleep,200
controlclick,x%vx% y%vy%,%noxxx%,%subb%
sleep,200
guicontrol , , Status_text, Find %image%
;mousemove, %vx%,%vy%
;msgbox x%vx% y%vy%,%noxxx%,%subb% return true
Gdip_ImageSearch(pBitmapHayStack,pBitmapNeedle,list,0,0,0,0,60,,1,1)
/*
if(vx <> LISTArray1 and vy <> LISTArray2)
{
Gclick(image)
}
*/
Gdip_DisposeImage(pBitmapHayStack), Gdip_DisposeImage(pBitmapNeedle)
Gdip_Shutdown(pToken)
return true
}
else
{
Gdip_Shutdown(pToken)
guicontrol , , Status_text, fail %image%
erro_check:=errocke+1
}
return false
}
감사합니다 사용해볼게요 미뮤에서는 안되나요?