Here is an example maybe you can use parts of the code.The search with gdip works for background window (but the standard mousemove only if it is visible and active).
Code: Select all
#include *i gdip_all.ahk
If !pToken := Gdip_Startup()
{
MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
ExitApp
}
;---------------- create demo gui ----------------
hbitmap:=Create_bgrd_png()
Gui, add,text,+0xE w200 h200 hwndimage_hwnd ; +0xE is SS_BITMAP
Gui, show,,demo
SendMessage, (STM_SETIMAGE:=0x172), (IMAGE_BITMAP:=0x0), hBitmap,, ahk_id %image_hwnd%
win_title:="demo"
;---------------- end create demo gui ----------------
sleep 2000
pBitmap := Gdip_BitmapFromHWND(WinExist(win_title))
; if needed get area of bitmap for search
x:=20 , y:=20 ,w:=100 ,h:=100
area_bitmap:=Gdip_CloneBitmapArea(pBitmap, x, y, w, h)
;color to search for
argb:=0xff28f028
Gdip_PixelSearch(area_bitmap,argb, posx, posy)
MouseMove, x+posx,y+posy
msgbox % x+posx "`n" y+posy
; if needed cleanup
Gdip_DisposeImage(pBitmap)
Gdip_DisposeImage(area_bitmap)
Gdip_Shutdown(pToken)
exitapp
Gdip_PixelSearch(pBitmap, ARGB, ByRef x, ByRef y)
{
static _PixelSearch
if !_PixelSearch
{
MCode_PixelSearch := "8B44241099535583E2035603C233F6C1F80239742418577E388B7C24148B6C24248B5424188D1C85000000008D64240033C085"
. "D27E108BCF3929743183C00183C1043BC27CF283C60103FB3B74241C7CDF8B4424288B4C242C5F5EC700FFFFFFFF5DC701FFFFFFFF83C8FF5BC38B4C2"
. "4288B54242C5F890189325E5D33C05BC3"
VarSetCapacity(_PixelSearch, StrLen(MCode_PixelSearch)//2)
Loop % StrLen(MCode_PixelSearch)//2 ;%
NumPut("0x" SubStr(MCode_PixelSearch, (2*A_Index)-1, 2), _PixelSearch, A_Index-1, "char")
}
Gdip_GetImageDimensions(pBitmap, Width, Height)
if !(Width && Height)
return -1
if (E1 := Gdip_LockBits(pBitmap, 0, 0, Width, Height, Stride1, Scan01, BitmapData1))
return -2
x := y := 0
E := DllCall(&_PixelSearch, "uint", Scan01, "int", Width, "int", Height, "int", Stride1, "uint", ARGB, "int*", x, "int*", y)
Gdip_UnlockBits(pBitmap, BitmapData1)
return (E = "") ? -3 : E
}
;---------------- ---------------- ---------------- ---------------- ----------------
; only for creating demo gui image
; ##################################################################################
; # This #Include file was generated by Image2Include.ahk, you must not change it! #
; ##################################################################################
Create_bgrd_png(NewHandle := False) {
Static hBitmap := 0
If (NewHandle)
hBitmap := 0
If (hBitmap)
Return hBitmap
VarSetCapacity(B64, 396 << !!A_IsUnicode)
B64 := "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AkZBiEH7Oc3tAAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAAAn0lEQVR42u3QQQ0AIAwEMELOxBzMvzIk8J4FaCV0LQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+kEoqHh62FQAAAAAAAAAAAAAAwNSnJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMB0AUZwAYVNlk1sAAAAAElFTkSuQmCC"
If !DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", 0, "UInt", 0x01, "Ptr", 0, "UIntP", DecLen, "Ptr", 0, "Ptr", 0)
Return False
VarSetCapacity(Dec, DecLen, 0)
If !DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", 0, "UInt", 0x01, "Ptr", &Dec, "UIntP", DecLen, "Ptr", 0, "Ptr", 0)
Return False
; Bitmap creation adopted from "How to convert Image data (JPEG/PNG/GIF) to hBITMAP?" by SKAN
; -> http://www.autohotkey.com/board/topic/21213-how-to-convert-image-data-jpegpnggif-to-hbitmap/?p=139257
hData := DllCall("Kernel32.dll\GlobalAlloc", "UInt", 2, "UPtr", DecLen, "UPtr")
pData := DllCall("Kernel32.dll\GlobalLock", "Ptr", hData, "UPtr")
DllCall("Kernel32.dll\RtlMoveMemory", "Ptr", pData, "Ptr", &Dec, "UPtr", DecLen)
DllCall("Kernel32.dll\GlobalUnlock", "Ptr", hData)
DllCall("Ole32.dll\CreateStreamOnHGlobal", "Ptr", hData, "Int", True, "PtrP", pStream)
hGdip := DllCall("Kernel32.dll\LoadLibrary", "Str", "Gdiplus.dll", "UPtr")
VarSetCapacity(SI, 16, 0), NumPut(1, SI, 0, "UChar")
DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", pToken, "Ptr", &SI, "Ptr", 0)
DllCall("Gdiplus.dll\GdipCreateBitmapFromStream", "Ptr", pStream, "PtrP", pBitmap)
DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", pBitmap, "PtrP", hBitmap, "UInt", 0)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pBitmap)
DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", pToken)
DllCall("Kernel32.dll\FreeLibrary", "Ptr", hGdip)
DllCall(NumGet(NumGet(pStream + 0, 0, "UPtr") + (A_PtrSize * 2), 0, "UPtr"), "Ptr", pStream)
Return hBitmap
}