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 Telegram: https://t.me/sergiol982
Win10x64 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

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

8

Re: AHK: PixelSearch

stealzy

Здравствуйте. Помогите мне пожалуйста с вашим кодом. У меня к сожалению не хватает навыков разобраться как заставить ваш код искать цвет одного пикселя в перекрытом окне...

Если вы можете покажите пожалуйста пример на этот код который у меня хорошо работает но только в активном окне.

{
PixelSearch,,,642,1047,642,1047,0x4eff00,,Fast RGB
If !ErrorLevel
{
Send, {vk57}
Sleep, 200
Send, {vk49}
}
}
return

Извините что беспокою Вас.. У меня уже просто идей нет.
С новым годом Вас.

9 (изменено: __Михаил__, 2021-01-02 09:51:05)

Re: AHK: PixelSearch

SHOX

Да вроде всё просто, правда не у всех окон удаётся получить цвет пикселя.

CoordMode, Mouse, Screen
CoordMode, Pixel, Screen

F3::	; Указать текущее окно и позицию.
MouseGetPos, X, Y, ID
WinGetTitle, App, Ahk_ID %ID%
Return

F4::	; Активация окна и перемещение мыши для теста.
WinActivate % App
Sleep, 100
MouseMove, % X, % Y
Return

F2::	; Получение цвета пикселя:
hWnd := WinExist(App)	; Получить идентификатор нужного окна.
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 % "Цвет пикселя BGR: " Format("{:#0X}", pix)
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}
}
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

10

Re: AHK: PixelSearch

__Михаил__
Здравствуйте.
Спасибо за ответ! Мне все ровно не понятно куда вставлять действие на найденный цвет пиксиля.  Но я попробую разобраться.

11

Re: AHK: PixelSearch

SHOX

F3 - указать окно и позицию пикселя.
F2 - получить в переменную 'pix' цвет пикселя в окне.
F4 - для проверки.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

12

Re: AHK: PixelSearch

Добрый день всем, прошу вашей помощи в написании скрипта, у меня не навыков программирования, но поставили задачу. Задача, есть области экрана, сервис открывается на браузере IE: примерно 25 мигающих подобий кнопок, но не кнопки, они периодически рандомно, и необязательно все вместе меняют цвет (красный, синий, желтый). Нужно сделать скрипт, который считывал бы цвета и в зависимости от цвета воспроизводил бы разные сигналы. Буду приогромно благодарен, и могу пару сотней на кофе скинуть, но как курсовая задача. Винда 7. Спасибо заранее!

13

Re: AHK: PixelSearch

YanuK, если хотите оплатить работу, создавайте тему в коммерческом разделе. В любом случае не стоит писать в чужой теме.

YanuK пишет:

могу пару сотней на кофе скинуть

Честно говоря, не думаю, что кого-то парой сотен сможете заинтересовать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder