1

Тема: AHK: PixelSearch

Всем привет.
В игре через BlueStacks скрипт проверяет пиксель и когда цвет совпадает запускается цепочка кликов. Все работает норм но только в активном окне.
Можно как то привязать PixelSerch как ControlClick к Блюстаку?


F1::
Label1:
Loop,
{
PixelSearch, xp, yp, 217, 276, 217, 276, 0xf5b853
Sleep 3000
If xp > 0
Break
}
Random, rand1, 1700, 3500
Random, var1, 33, 795
Random, var2, 55, 470
ControlClick, X%var1% Y%var2%, ahk_exe BlueStacks.exe, ,left ;Клик в экран
Sleep, rand1
Random, var3, 320, 500
Random, var4, 225, 377
ControlClick, X%var3% Y%var4%, ahk_exe BlueStacks.exe, ,left ;Клик в сундук
Sleep, rand1
Random, var7, 362, 407
Random, var8, 396, 425
ControlClick, X%var7% Y%var8%, ahk_exe BlueStacks.exe, ,left ;Продать
Sleep, rand1
Random, var5, 290, 397
Random, var6, 300, 345
ControlClick, X%var5% Y%var6%, ahk_exe BlueStacks.exe, ,left ;OK
Sleep, rand1
Random, var9, 153, 378
Random, var10, 270, 318
ControlClick, X%var9% Y%var10%, ahk_exe BlueStacks.exe, ,left ;Повторить
Goto, Label1
F10::ExitApp

2

Re: AHK: PixelSearch

Можно, но не через PixelSearch. Поищите "PixelSearch для неактивного окна", уже несколько раз обсуждалось.

3

Re: AHK: PixelSearch

Искал и не нашел ни чего толкового, поэтому вот задал вопрос.

4

Re: AHK: PixelSearch

stealzy пишет:

Можно, но не через PixelSearch.

Так вроде не было озвучено что окно может быть перекрыто.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

5 (изменено: Papajaa, 2019-01-18 09:53:18)

Re: AHK: PixelSearch

Нашел вот такое решение


CoordMode, Pixel, Screen
F1::
Label1:
Loop,
{
PixelSearch, xp, yp, 1280, 727, 1377, 807, 0xf5b853, 2, Fast
Sleep 3000
If xp > 0
Break
}
msgbox, fghfghfgh

Но это не совсем то, хочу что бы искало и в перекрытом окне
Просто хотелось бы узнать у знающих людей такое возможно или не искать, я то в этих делах ноль. Методом тыка франкинштэйна своего собираю.

6 (изменено: stealzy, 2019-01-18 21:07:02)

Re: AHK: PixelSearch

Взятие пикселя в перекрытом окне:

exe := "notepad.exe", x := 2, y := 2
;=======================================
prev := WinExist("A")
Run % exe
WinWait % "ahk_exe" exe
hWnd := WinExist("ahk_exe" exe)
WinActivate % "ahk_id" prev
sleep 100

p := WinGetP(hWnd)
xRel := x + p.ClientWin.x, yRel := y + p.ClientWin.y

hDC := Window_CreateCapture(hWnd)
pix := GetPixel(hDC, xRel, yRel)
Window_DeleteWindowCapture(hWnd, hDC)

MsgBox % Format("{:#0x}", pix)
WinClose % "ahk_exe" exe
Return

Window_CreateCapture(hwnd) {
	Return DllCall("user32.dll\GetDCEx", "UInt", hwnd, "UInt", 0, "UInt", 1|2)
}
GetPixel(hDC, x, y) {
	Return DllCall("gdi32.dll\GetPixel", "UInt", hDC, "Int", x, "Int", y, "UInt") ; colorBGR
}
Window_DeleteWindowCapture(hwnd, hDC) {
	DllCall("user32.dll\ReleaseDC", "UInt", hwnd, "UInt", hDC)
}
WinGetP(hwnd) {
	WinGetPos, x, y, w, h, ahk_id %hwnd%
	WinP := {x:x, y:y, w:w, h:h}
	VarSetCapacity(pt, 16)
	NumPut(x, pt, 0) || NumPut(y, pt, 4) || NumPut(w, pt, 8) || NumPut(h, pt, 12)
	if (!DllCall("GetClientRect", "uint", hwnd, "uint", &pt))
		Return
	if (!DllCall("ClientToScreen", "uint", hwnd, "uint", &pt))
		Return
	x := NumGet(pt, 0, "int"), y := NumGet(pt, 4, "int")
	w := NumGet(pt, 8, "int"), h := NumGet(pt, 12, "int")
	ClientScr := {x:x, y:y, w:w, h:h}
	ClientWin := {x:x-WinP.x, y:y-WinP.y, w:w, h:h}
	Return WinP := {x:WinP.x, y:WinP.y, w:WinP.w, h:WinP.h, ClientWin:ClientWin, ClientScr:ClientScr}
}

Поиск пикселя с gdi (понадобится ahk библиотека GDIP):

SetBatchLines, -1
CoordMode, Pixel, screen
pToken := Gdip_Startup()

SearchPixel := 0xffffffff
; variation := 0x11

Start := A_TickCount
; loop 100 {
	pBitmap := Gdip_BitmapFromScreen("0|0|1920|1080")
	width := Gdip_GetImageWidth(pBitmap)
	height := Gdip_GetImageHeight(pBitmap) 
	Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)

	bgr1 := SearchPixel
	loop % width + (n:=0)
	{
		A_Index_X := A_Index-1
		loop % height
		{ 
			bgr2 := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
			; if !(abs((bgr1 & 0xff) - (bgr2 & 0xff)) > variation)
			; && !(abs(((bgr1 >> 8) & 0xff) - ((bgr2 >> 8) & 0xff)) > variation)
			; && !(abs(((bgr1 >> 16) & 0xff) - ((bgr2 >> 16) & 0xff)) > variation)
			if (bgr1=bgr2)
				++n
		}
	}
	Gdip_UnlockBits(pBitmap, BitmapData)
	Gdip_DisposeImage(pBitmap)
; }
msgbox % n "`n" A_TickCount - Start
Gdip_Shutdown(pToken)

Теперь сможете собрать как вы любите.

7 (изменено: Papajaa, 2019-01-23 10:46:37)

Re: AHK: PixelSearch

Все получилось с первым вариантом, спасибо большое