이것저것 소스조금씩 보면서 많이 배우고 있는 초보입니다. 전에 알수없는 이유로인해 Gdip이미지서치가 안되어
비활성 이미지서치를 손놓고 비활성 입력으로만 매크로를 만들어서 사용했는데...어제부로 오토핫키32비트로
설치하니 정상적으로 이미지 서치가 되더군요(기존64비트설치)
전에 셋쇼마루님이 주신 소스를 이용해서 서치해봤는데 정확히 좌표까지 넘어와 이미지가 서치되는 것을 확인 했습니다.
뭐가 뭔지 모르고 그냥 따라하다 보니 응용이 안되네요 콘소스통으로 올려놓은거 봐도 소스가 길어서 초보가 보기엔 좀 이해가 힘들었습니다. 고수님들은 하찮은것일 수도 있지만 주석좀 적어서 주시면 감사할게요
필요한거는 지역이미지서치, trans가능한 함수 이 두가지 입니다. 블루스택1을 사용중입니다.
좋은 예제가 있으면 좋을 것 같습니다. 감사합니다.
#Singleinstance Force
#Include Gdip.ahk
SetBatchLines, -1
SetWorkingDir, %A_WorkingDir%
ImageSearch_uka(Title, ImgFileName, ByRef Pos_X, ByRef Pos_Y, DebugMode=false)
{
If !pToken := Gdip_Startup()
{
MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
ExitApp
}
; OnExit, Exit
pBitmapHayStack := Gdip_BitmapFromHWND(hwnd := WinExist(Title))
pBitmapNeedle := Gdip_CreateBitmapFromFile(ImgFileName)
Width1 := Gdip_GetImageWidth(pBitmapHayStack), Height1 := Gdip_GetImageHeight(pBitmapHayStack)
Width2 := Gdip_GetImageWidth(pBitmapNeedle), Height2 := Gdip_GetImageHeight(pBitmapNeedle)
E1 := Gdip_LockBits(pBitmapHayStack, 0, 0, Width1, Height1, Stride1, Scan01,BitmapData1)
E2 := Gdip_LockBits(pBitmapNeedle, 0, 0, Width2, Height2, Stride2, Scan02,BitmapData2)
MCode(Gdip_ImageSearch, "83EC148B4424309983E20303C28BC88B442434995383E2035503C2C1F80256C1F902837C24"
. "30005789442420C7442410000000000F8EBE0000008B5C24288B7C24388D048D00000000894424188B442430895C241CE"
. "B098DA424000000008BFFC74424440000000085C07E6D895C24148B6C242CC7442440000000008D6424008B4C24403B4C"
. "243C0F8D8600000033C985FF7E158BD58BF38B063B02751F4183C20483C6043BCF7CEF8B442420035C2418FF44244003C"
. "003C003E8EBC38B4C24448B5C24148B4424304183C3043BC8894C2444895C24147C978B4C24108B5C241C035C2418413B"
. "4C2434894C2410895C241C0F8C68FFFFFF8B5424488B44244C5F5E5DC702FFFFFFFFC700FFFFFFFF5B83C414C38B4C244"
. "48B5424488B44244C5F495E890A8B4C24085D89085B83C414C3")
Time1 := A_TickCount
VarSetCapacity(x, 8, 0), VarSetCapacity(y, 8, 0)
Loop, 100
DllCall(&Gdip_ImageSearch, "uint", Scan01, "uint", Scan02, "int", Width1, "int", Height1, "int", Width2, "int", Height2, "int", Stride1, "int", Stride2, "int*", x, "int*", y)
Pos_X := X, Pos_Y := Y
if (DebugMode = true)
MsgBox, % "Time for 100 searches: " A_TickCount-Time1 "ms`nx: " x "`ny: " y ; 디버깅용
Gdip_UnlockBits(pBitmapHayStack,BitmapData1), Gdip_UnlockBits(pBitmapNeedle,BitmapData2)
Gdip_DisposeImage(pBitmapHayStack), Gdip_DisposeImage(pBitmapNeedle)
return
}
MCode(ByRef code, hex)
{
VarSetCapacity(code, StrLen(hex)//2)
Loop % StrLen(hex)//2 ;%
NumPut("0x" SubStr(hex, 2*A_Index-1, 2), code, A_Index-1, "char")
}
;;;;;;;;;;Gdip 이미지서치 함수▲
Click(x, y)
{
Ukano := x | y<<16
WinGet, ActiveID, ID, BlueStacks App Player
PostMessage, 0x201, 0, %Ukano%,, ahk_id %ActiveID%
PostMessage, 0x202, 0, %Ukano%,, ahk_id %ActiveID%
}
;;;;;;;;;; 비활성클릭 함수 ▲
F1::
ImageSearch_uka("BlueStacks App Player","1.png", x, y)
MsgBox %x%/%y%
Click(x,y)
return
블루스택1이시면 아래 함수가 간단하고 좋습니다.
winget,title,ID,BlueStacks App Player
if (gdip_imagesearchwithhwnd(title,a.png,x,y,trans="색상코드"))
Gdip_ImageSearchWithHwnd(Hwnd,Image,Byref X,Byref Y,Variation=0, sX = 0, sY = 0, eX = 0, eY = 0, Trans="")
{
gdipToken := Gdip_Startup()
bmpHaystack := Gdip_BitmapFromHwnd(Hwnd)
bmpNeedle := Gdip_CreateBitmapFromFile(Image)
RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST,sX,sY,eX,eY,Variation,Trans,1,1)
Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(gdipToken)
StringSplit, LISTArray, LIST, `,
X := LISTArray1
Y := LISTArray2
return RET
}