1

Тема: Одновременный поиск нескольких пикселей.

Здравствуйте.
Не мог бы кто подсказать как сделать так что бы PixelSearch искал несколько разных пикселей в одной и той же области.

Имеется код:

+ открыть спойлер
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.




#Persistent
SetBatchLines, -1  
SetTimer, S1, 0
Pause

*~XButton2::
Loop
	{
S1:
MouseGetPos, xpos, ypos
zX1:=xpos-5,zX2:=xpos+5,zY1:=ypos-5,zY2:=ypos+5
PixelSearch, VarX, VarY, zX1, zY1, zX2, zY2, 0x000001, 4, Fast RGB
PixelSearch, VarX, VarY, zX1, zY1, zX2, zY2, 0x000002, 2, Fast RGB
PixelSearch, VarX, VarY, zX1, zY1, zX2, zY2, 0x000003, 1, Fast RGB

if !ErrorLevel
{
;Sleep, 10
;MouseMove, VarX, VarY
;moveAmount := (moveAmount = 2) ? 3 : 0
;mouseXY(moveAmount,1000)
MouseClick ,, ;	VarX, VarY,, 0
SetTimer, S1, Off
SetTimer, S2, -50
}
	If !GetKeyState("XButton2", "P")
		         Break
   }
Return
mouseXY(VarX,VarY)
{
DllCall("mouse_event",int,1,int,x,int,y,uint,0,uint,0)
}

End::ExitApp 

S2:
SetTimer, S1, On 
Return

Цвета взяты просто для примера:

PixelSearch, VarX, VarY, zX1, zY1, zX2, zY2, 0x000001, 4, Fast RGB
PixelSearch, VarX, VarY, zX1, zY1, zX2, zY2, 0x000002, 2, Fast RGB
PixelSearch, VarX, VarY, zX1, zY1, zX2, zY2, 0x000003, 1, Fast RGB

Это совершенно разные цвета и "подбор тонна" сюда не подходит. (0-255 перед фаст)

Но в данном случае ищет только последнюю строчку PixelSearch, а нужно что бы искало все 3 варианта одновременно.
Есть мысль по поводу If и Else, но не понимаю как это реализовать, да и кажется что это будет малоэффективно так как на перебор условий уйдёт слишком много времени я полагаю.

Может быть есть другой вариант?

Если нет то можно небольшой пример с If Else и PixelSearch?

Спасибо!

2

Re: Одновременный поиск нескольких пикселей.

Я код не запускал, но с виду всё правильно. Просто вот здесь

PixelSearch, VarX, VarY, zX1, zY1, zX2, zY2, 0x000001, 4, Fast RGB
PixelSearch, VarX, VarY, zX1, zY1, zX2, zY2, 0x000002, 2, Fast RGB
PixelSearch, VarX, VarY, zX1, zY1, zX2, zY2, 0x000003, 1, Fast RGB

Вы сохраняете значения в одни и те же переменные три раза подряд. То есть каждый последующий проход "затирает" предыдущий. Логично предложить так:


PixelSearch, VarX_1, VarY_1 zX1, zY1, zX2, zY2, 0x000001, 4, Fast RGB
PixelSearch, VarX_2, VarY_2, zX1, zY1, zX2, zY2, 0x000002, 2, Fast RGB
PixelSearch, VarX_3, VarY_3, zX1, zY1, zX2, zY2, 0x000003, 1, Fast RGB

3

Re: Одновременный поиск нескольких пикселей.

Много времени уходит на тройной PixelSearch, потому что каждый раз команда делает новый снимок экрана и ищет "с нуля".
Есть функции для замены PixelSearch, которые будут работать в три раза (в данном случае) быстрее. Поищите на форуме, если интересно.

4

Re: Одновременный поиск нескольких пикселей.

stealzy извините, речь идёт о GDI+ (GDIP)?

ypppu спасибо я понял и исправил "это недоразумение", но при вводе даже второй "переменной" код начинает работать некорректно, я не говорю уже о 3-ей и 4-ой... При попытке найти 2-ой совершенно другой цвет, мышь начинает кликать на все возможные цвета, в чем может быть проблема?

Приблизительный код: (новый)

+ открыть спойлер
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.




#Persistent
SetBatchLines, -1  
SetTimer, S1, 0
Pause

*~XButton2::
Loop
	{
S1:
MouseGetPos, xpos, ypos
zX1:=xpos-5,zX2:=xpos+5,zY1:=ypos-5,zY2:=ypos+5
PixelSearch, VarX_1, VarY_1, zX1, zY1, zX2, zY2, 0x000001, 4, Fast RGB
PixelSearch, VarX_2, VarY_2, zX1, zY1, zX2, zY2, 0x000002, 2, Fast RGB

if !ErrorLevel
{
;Sleep, 10
;MouseMove, VarX, VarY
;moveAmount := (moveAmount = 2) ? 3 : 0
;mouseXY(moveAmount,1000)
MouseClick ,, ;	VarX_1, VarY_1,, 0
MouseClick ,, ;	VarX_2, VarY_2,, 0
SetTimer, S1, Off
SetTimer, S2, -50
}
	If !GetKeyState("XButton2", "P")
		         Break
   }
Return
mouseXY(VarX,VarY)
{
DllCall("mouse_event",int,1,int,x,int,y,uint,0,uint,0)
}

End::ExitApp 

S2:
SetTimer, S1, On 
Return