1

Тема: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Сценарий совершает клик по первым найденным элементам, соответсвующим заданным критериям, если они найдены.
Как реализовать нажатие по всем элементам на экране, соответсвующим заданным критериям? Т.е. у каждого заданного элемента на экране может быть несколько копий, по всем из них необходимо совершить клик.

1::
ImageSearch, pic1X, pic1Y, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\pic1.png
	If ErrorLevel = 0
	MouseClick, Left, %pic1X%, %pic1Y%
ImageSearch, pic2X, pic2Y, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\pic2.png
	If ErrorLevel = 0	
	MouseClick, Left, %pic2X%, %pic2Y%
return

2

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

http://forum.script-coding.com/viewtopi … 560#p84560

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

serzh82saratov, спасибо, работает! Но хотелось бы, чтобы клики происходили быстрее. В команде MouseClick есть параметр для установки скорости совершения клика, можно ли здесь установить что-то подобное?

#SingleInstance Force
#Persistent
#NoEnv
ListLines Off
SetBatchLines -1
CoordMode, Pixel
CoordMode, Mouse

1:: 
	For k, v in SeveralSearch(0, 0, 1000, 500, "pic.png")
		Click % v[1]+10 " " v[2]+5
	Return

SeveralSearch(ix1, iy1, w, h, file)  {
	x1 := ix1, y1 := iy1, x2 := ix1 + w - 1, y2 := iy1 + h - 1
	prY := y2, ErrorCount := 0, Coords := []
	Loop
	{
		ImageSearch, mX, mY, x1, y1, x2, y2, %file%
		If (ErrorLevel && ++ErrorCount > 1)
			Break
		If (mY = "" || mY > prY)
			x1 := ix1, y1 += 1, prY := y2
		Else
			x1 := mX + 1, ErrorCount := 0, y1 := mY, prY := mY, Coords.Push([mX, mY])
	}
	Return Coords
}
return

Также необходимо задать координаты поиска изображения относительно заданного класса контрола. Как это можно сделать?


Control()
{
   IfWinActive ahk_exe Program.exe
	{
	MouseGetPos, , , id, control
	n := RegExReplace(control, "\D")
	If (n>=16) and (n<=28)
	return !ErrorLevel
	}
}

4

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Кто-нибудь может подсказать, как к сценарию из 3-го поста добавить условие работы в упомянутой области окна программы, а также установить параметр, который бы совершал клики с максимальной скоростью и одновременно по всем найденным элементам?

5

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Подскажите, пожалуйста, как в сценарии их третьего поста добавить к поиску ряд изображений вместо одного?

6

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

becauseim, включайте соображалку. Чем дальше, тем более простые вопросы задаёте.

7 (изменено: svoboden, 2017-03-11 22:09:35)

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

becauseim, тут уже был ответ на ваш вопрос. Создаете массив и вызываете его в команде, array[A_Index].

8

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Можно ещё так:


; srchPic - путь до изображения относительно файла сценария; x, y, w, h - область поиска, a - погрешность в оттенках от 0 до 255
FindAllPicture(srchPic, x, y, w, h, a:=0) {
	oImageFile:=ComObjCreate("WIA.ImageFile"), oImageFile.LoadFile(srchPic)
	file_w := oImageFile.Width, file_h := oImageFile.Height
	picArr := []
	x_srch := x, y_srch := y, w_srch := w, h_srch := h
	fail := 0
	while (fail < 2) {
		ImageSearch, x_pos, y_pos, x_srch, y_srch, w_srch, h_srch, % "*" a " " srchPic
		if (ErrorLevel == 0) {
			fail := 0
			picArr.Push(x_pos, y_pos)
			x_srch := x_pos + file_w, y_srch := y_pos, h_srch := y_pos + file_h
		} else if (ErrorLevel == 1 && fail == 0) {
			fail++
			x_srch := x, y_srch := h_srch, h_srch := h
		} else if (ErrorLevel == 1 && fail == 1) {
			fail++
		}
	}
	return picArr
}

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


picPath:="MyImg\SomeFolder\Picture.bmp"
coordArray:=[]
coordArray:=FindAllPicture(picPath,0,0,A_ScreenWidth,A_ScreenHeight,10)
i:=1
loop,% coordArray.Length()//2 {
	xx:=coordArray[i++],yy:=coordArray[i++]
	Send {Click,%xx%,%yy%,0}
	Sleep, 500
}

9 (изменено: serzh82saratov, 2017-01-19 22:14:00)

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям


#SingleInstance Force 
#NoEnv
ListLines Off
SetBatchLines -1
CoordMode, Pixel
CoordMode, Mouse

1:: 
	For k, v in SeveralSearch(100, 100, 1300, 725, ["1.png","2.png","3.png"])
		MouseClick, , v[1]+1, v[2]+1, , 0
	Return

SeveralSearch(ix1, iy1, w, h, files, variation = 0)  { 
	Coords := []
	For k, file in files
	{
		x1 := ix1, y1 := iy1, x2 := ix1 + w - 1, y2 := iy1 + h - 1
		prY := y2, ErrorCount := 0
		Loop
		{
			ImageSearch, mX, mY, x1, y1, x2, y2, *%variation% %file%
			If (ErrorLevel && ++ErrorCount > 1)
				Break
			If (mY = "" || mY > prY)
				x1 := ix1, y1 += 1, prY := y2
			Else
				x1 := mX + 1, ErrorCount := 0, y1 := mY, prY := mY, Coords.Push([mX, mY])
		}
	} 
	Return Coords
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

KusochekDobra пишет:

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

Думаю не самая хорошая идея, если в линии будет находится часть картинки, она не будет найдена.

KusochekDobra пишет:

ComObjCreate("WIA.ImageFile")

Начиная с Висты.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Благодарю.
Если позволите, не по теме вопрос:


If (mY = "" || mY > prY)

Здесь знак равенства кроме сравнения ещё и присваивает "" ? Если да, то с какой целью?

12

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Нет, только сравнение.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13 (изменено: becauseim, 2017-01-20 09:12:02)

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

svoboden, да. я пробовал самостоятельно модифицировать сценарий на основе подсказок из упомянутой Вами темы. Не получилось.
KusochekDobra, Ваш вариант подразумевает более быструю работу сценария благодаря системным функциям? Или это просто альтернативный вариант?
serzh82saratov, Спасибо!

14

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Я бы сказал, что мой пример не совсем корректен. Как верно обозначил serzh82saratov, искомый фрагмент не будет найден, если окажется в области поиска со смещением вниз хотя бы на 1 пиксель, которая в свою очередь превращается в линию, высотой, равной высоте фрагмента. Сделано это для того, чтобы не пропустить возможные фрагменты находящиеся на той же высоте, потому как после нахождения, начало области поиска сдвигается до позиции, следующей по X координате за найденным и его же Y координате. Он будет вполне работоспособен, если анализируемое изображение содержит искомые фрагменты расположенные в перпендикулярной сетке, в которой они могут находиться на той же Y координате, что и предыдущий, или не выше, чем Y координата окончания высоты фрагмента +1 пиксель. Как шахматная доска, например. И да, из-за смещения области поиска на высоту фрагмента, должен работать быстрее. Но заметно это будет едва ли. Разве, что Вы собираетесь анализировать области с очень большим разрешением, и/или содержащим фрагменты значительной высоты.
Здесь:


oImageFile:=ComObjCreate("WIA.ImageFile"), oImageFile.LoadFile(srchPic)
file_w := oImageFile.Width, file_h := oImageFile.Height

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

Забрал для личного пользования.

15

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

serzh82saratov, даже стало работать быстрее. Так понимаю, это связано с заменой

Click % v[1]+10 " " v[2]+5

на

MouseClick, , v[1]+10, v[2]+1, , 0

16

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

becauseim пишет:

е. В команде MouseClick есть параметр для установки скорости совершения клика, можно ли здесь установить что-то подобное?

Вы же сами всё знааете...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

serzh82saratov, не могу понять, как получить/задать переменные координатам найденных изображений. Необходимо перетащить один из элементов первой пары изображений на второе. Т.е. примерно следуюущее:

1::
SeveralSearch(0, 0, A_ScreenWidth/6, A_ScreenHeight, ["PicOne1.png","PicOne2.png"])
SeveralSearch(0, 0, A_ScreenWidth/6, A_ScreenHeight, ["PicTwo1.png","PicTwo2.png"])
MouseClickDrag, Left, %PicOneX%, %PicOneY%, %PicTwoX%, %PicTwoY%, 0
return

Подскажите решение, пожалуйста.

18

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Если надо найти одну картинку, а потом одну другую, то как это укладывается в концепцию поиска нескольких совпадений одной картинки, и нескольких совпадений нескольких картинок?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19 (изменено: KusochekDobra, 2017-01-22 15:18:45)

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

becauseim, Вы либо неверно истолковываете задачу, либо неверно её понимаете. Если требуется найти все расположения двух разных фрагментов и первые перетащить на вторые, то такая запись будет рабочей, даже если фрагментов будет по одному:


1::
	allCoord_one:=SeveralSearch(0, 0, A_ScreenWidth/6, A_ScreenHeight, ["PicOne.png"])
	allCoord_two:=SeveralSearch(0, 0, A_ScreenWidth/6, A_ScreenHeight, ["PicTwo.png"])
	loop,% allCoord_one.Length() {
		MouseClickDrag, Left, % allCoord_one[A_Index][1], % allCoord_one[A_Index][2], % allCoord_two[A_Index][1], % allCoord_two[A_Index][2], 0
	}
return

Используя предложенную методу, следует исходить из того, что SeveralSearch() - возвращает массив, содержащий массивы с парами координат всех найденных изображений, переданных ему в пятом параметре. Соответственно, фильтровать его содержимое для работы с координатами разных графических фрагментов, будет возможно, если точно известно количество самих фрагментов. Или их нужно считать в процессе работы SeveralSearch(). В противном случае, если нужны не просто все координаты всех найденных фрагментов, а как например, в примере выше, то для каждого фрагмента проще использовать свой вызов SeveralSearch().

20

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

serzh82saratov, да, Вы правы, я запутался. В данном случае мне необходимо обнаружение первого из перечисленных изображений. Т.е. если найдено первое изображение из первой пары, то не переходить к поиску второго. А если у найденного изображения имеется несколько совпадений на экране, то получать координаты первого (одного) найденого изображения.

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

KusochekDobra, нет, координаты всех совпадений не требуются. Только первого найденного из двух перечисленных. То же самое по второй паре изображений, чтобы можно было впоследствии произвести MouseClickDrag.

21

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

becauseim пишет:

...необходимо обнаружение первого из перечисленных изображений. Т.е. если найдено первое изображение из первой пары, то не переходить к поиску второго. А если у найденного изображения имеется несколько совпадений на экране, то получать координаты первого (одного) найденого изображения.

В постановке задачи несостыковка. Вы описываете условия, при которых второй фрагмент не участвует в работе. И стандартный поиск всегда возвращает координаты первого(слева->направо и сверху->вниз) изображения, что исключает саму необходимость поиска копий, если исходить из описания условий.

22 (изменено: becauseim, 2017-01-22 18:22:28)

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

KusochekDobra, так проще: при нажатии на горячую клавишу, необходимо найти на экране файл PicOne1, который следует затем потянуть на другой найденный файл PicTwo1. При этом, вместо первого может оказаться лишь его вариация, а именно PicOne2, а на месте второго - PicTwo2.

На экране могут оказаться сразу оба изображения: PicOne1 и PicOne2, и даже несколько копий каждого из них. Необходимо получить координаты первого найденного. То же самое касается и получения конечных координат для перетягивания.

23

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

becauseim, |так и ищите первую картинку, если не нашли ищите вторую, потом тоже самое с третьей и четвертой.
Зачем вы усложняете?

ImageSearch, FoundX, FoundY, 40,40, 300, 300, C:\My Images\test1.bmp
if ErrorLevel != 0
   ImageSearch, FoundX, FoundY, 40,40, 300, 300, C:\My Images\test2.bmp
ImageSearch, FoundX1, FoundY1, 40,40, 300, 300, C:\My Images\test3.bmp
if ErrorLevel != 0
   ImageSearch, FoundX1, FoundY1, 40,40, 300, 300, C:\My Images\test4.bmp

24

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Malcev, не знаю, зачем. Работает, спасибо! Я пытался сделать то же самое самостоятельно, но видимо неправильно задавал условие ErrrorLevel. Подскажите, пожалуйста, на Вашем примере, как упростить перебор файлов, если их названия отличаются только индексом?

25 (изменено: KusochekDobra, 2017-01-22 19:49:13)

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям


frstItems_arr:=["PicOne1.png"	; Первое искомое изображение для перетаскивания
			  , "PicOne2.png"]	; Второе
scndItems_arr:=["PicTwo1.png"	; Первое искомое изображение цель
			  , "PicTwo2.png"]	; Второе
x:=0,y:=0,w:=A_ScreenWidth/6,h:=A_ScreenHeight	; Область поиска
while (true) {
	loop,% frstItems_arr.Length() {
		ImageSearch, x_frst, y_frst, x, y, w, h,% frstItems_arr[A_Index]
		if (ErrorLevel==0) {
			loop,% scndItems_arr.Length() {
				ImageSearch, x_scnd, y_scnd, x, y, w, h,% scndItems_arr[A_Index]
				if (ErrorLevel==0) {
					MouseClickDrag, Left, %x_frst%, %y_frst%, %x_scnd%, %y_scnd%, 0
					break,2
				}
			}
		}
	}
	sleep, 200
}

Бесконечный цикл, в котором примерно 5 раз в секунду проверяется наличие графических элементов содержащихся в массиве "frstItems_arr". Если любой из них будет найден, в той же области производится поиск любого графического фрагмента, имена которых содержатся в "scndItems_arr" и если любой из них будет найден, выполняется "MouseClickDrag" и возврат к поиску элементов массива "frstItems_arr". Если количество элементов первого и второго типа будет меняться, достаточно внести эти изменения в соответствующий массив.

26

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Подскажите, пожалуйста, на Вашем примере, как упростить перебор файлов, если их названия отличаются только индексом?

А куда уж тут упрощать?
Можно, конечно, это все обернуть в функцию или сделать массив, но вы потом сможете сами, что-либо в нем поправить?

27

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Malcev пишет:

А куда уж тут упрощать?

Смотрел примеры с %A_Index%, но находил только примеры с массивами, где перечислены все переменные. Такой вариант несильно упростит, т.к., насоклько я понимаю, так или иначе придется перечислять названия файлов. Мне казалось, что в AHK есть универсальный элемент для замены порядкового числа. Интересно было бы взглянуть на функцию.

28

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Интересно было бы взглянуть на функцию.

Так сделайте. По аналогии:
http://www.script-coding.com/AutoHotkey/Functions.html

29

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

["", 0, 3, "png"] - ищем сначала от 0.png до 3.png.
["a", 1, 4,"png"] - после от a1.png до а4.png. Вместо первого ключа "a" (префикса) может быть и путь до числа.


#SingleInstance Force
#NoEnv
CoordMode, Pixel
CoordMode, Mouse 

1:: 
	If DragSearch(100, 100, 1300, 725, ["", 0, 3, "png"], ["a", 1, 4,"png"], M) 
		MouseClickDrag, Left, M.X1, M.Y1, M.X2, M.Y2, 0
	Return

DragSearch(x1, y1, x2, y2, r1, r2, byref arr)  {
	Loop % 2 . (arr := {})
		Loop % (i := A_Index) * 0 + (c := r%i%[3] - r%i%[2] + 1)
		{
			ImageSearch, mX, mY, x1, y1, x2, y2, % r%i%[1] (r%i%[2] - 1 + A_Index) "." r%i%[4]
			If !ErrorLevel && (1, arr["X" i] := mX, arr["Y" i] := mY) 
				Break
			If (A_Index = c)
				Return 0, arr := ""
		}
	Return 1
}

Esc::
	ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30 (изменено: serzh82saratov, 2017-01-23 00:27:57)

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Лучше сразу так:

#SingleInstance Force
#NoEnv
ListLines Off
SetBatchLines -1
CoordMode, Pixel
CoordMode, Mouse

1:: 
	If DragSearch(100, 100, 1300, 725, [["", 0, 3, "png"], ["a", 1, 4,"png"]], M) 
		MouseClickDrag, Left, M.X1, M.Y1, M.X2, M.Y2, 10
	Return
 

DragSearch(x1, y1, x2, y2, r, byref arr)  { 
	For i, v in r, arr := {}
		Loop % (c := v[3] - v[2] + 1) {
			ImageSearch, mX, mY, x1, y1, x2, y2, % v[1] (v[2] - 1 + A_Index) "." v[4]
			If !ErrorLevel && (1, arr["X" i] := mX, arr["Y" i] := mY) 
				Break
			If (A_Index = c)
				Return 0, arr := ""
		} Return 1
}

Esc::
	ExitApp

А то вдруг понадобится не 2 группы картинок, а 10.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

31

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

serzh82saratov, спасибо! Но кажется, я не понял, как использовать такой вариант. Внес в кавычки вместо "png" полные пути к изображениям - не сработало. Пользуюсь простым вариантом от Malcev.

32

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

becauseim пишет:

Внес в кавычки вместо "png" полные пути к изображениям

Это как?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

33

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

If DragSearch(100, 100, 1300, 725, [["", 0, 3, "PicOne.png"], ["a", 1, 4,"PicTwo.png"]], M) 

Насчет необходимости дописывания индексов в Вашем варианте не в курсе, поэтому, пробовал указывать и оригинальные названия: PicOne1.png, PicTwo1.png

34

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Ну а искать то какие надо пути?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

35

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

serzh82saratov, изображения кладу рядом со скриптом, поэтому, полный путь выглядит именно так.

36

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Ну то есть 2 картинки PicOne1.png и PicTwo1.png, а индексы зачем, если их всего 2?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

37 (изменено: becauseim, 2017-01-23 02:14:47)

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

serzh82saratov, изображений в моем случае всего пять: PicOne1.png, PicOne2.png, PicTwo1.png, PicTwo2.png, PicTwo3.png.

38

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

[["PicOne", 1, 2, "png"], ["PicTwo", 1, 3, "png"]]

Из этого:

serzh82saratov пишет:

["", 0, 3, "png"] - ищем сначала от 0.png до 3.png.
["a", 1, 4,"png"] - после от a1.png до а4.png. Вместо первого ключа "a" (префикса) может быть и путь до числа.

Вроде такой же вывод получается.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

39

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

serzh82saratov, извиняюсь, все-таки я неверно внес данные о файлах. Все работает. Спасибо! Конечно, мне совсем не ясна структура функции в виду ее оформления посредством регулярных выражений. В этом смысле вариант от KusochekDobra проще для понимания. Только интересно, почему цикличный поиск в его варианте оформлен не с помощью loop, а с помощью while (true). Конечно, я бы его исключил, т.к. необходим поиск по горячей клавише, но все-таки интересно, в чем отличие и как это работает.

40 (изменено: KusochekDobra, 2017-01-23 17:07:47)

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

Циклы "While (условие)" выполняются, пока "условие" возвращает "истина". В том примере "истиной" является само условие, поэтому цикл бесконечный. Это просто пример. Вы же приобщаетесь ко всеобщей мудрости, верно? Полезно, когда примеры разнообразны.
В примере serzh82saratov нет регулярных выражений. Очень содержательный в плане разнообразия пример.
DragSearch() - принимает после координат области поиска, массив, с массивами данных о двух типах фрагментов, которые предполагается найти. В них параметры по счёту:
1 - имя/путь файла без расширения(напр.:"Изображение" или "C:\MyFolder\Изображение").
2 - первый индекс изображения(напр.:"Изображение0", где 0 - его индекс).
3 - последний индекс изображения(напр.:"Изображение3", где 3 - его индекс).
4 - расширение файла изображения.
После чего, оба массива перебираются по очереди в пределах разницы индексов между третьим и вторым параметром. Если изображение было найдено, его координаты присваиваются полям объекта "arr", который связан по ссылке с параметром "M" в вызове функции DragSearch() и происходит переход ко второму массиву, с данными о другом изображении. Если перебор цикла завершился а изображение не было найдено, DragSearch() завершает работу возвращая вызывающему коду "ложь". В этом случае "MouseClickDrag" произведено не будет, иначе, значения присвоенные полям объекта "M" извлекаются оператором "."(точка) прямо в процессе "MouseClickDrag" и происходит ожидаемый эффект.

Как всегда, "E=MC2"!

41

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

KusochekDobra, Спасибо! Попытаюсь проанализировать описание приложив его к сценарию.

42

Re: AHK: ImageSearch. Найти все элементы, соответствующие критериям

serzh82saratov, функция DragSearch находит координаты на основе найденных изображений из предложенных. В моем случае, при удачном срабатывании сценария, изображение из конечной координаты для перетаскивания всегда меняется на одно из заданных, но так как скрипт не всегда срабатывает с первого раза, хотелось бы добавить сравнение данного изображения после команды MouseClickDrag, и в случае, если изображение осталось неизменным, повторить MouseClickDrag.

Например, в моем случае, конечной координатой может быть изображение с индексом от 1 до 4:


If DragSearch(100, 100, 1300, 725, [["image", 1, 2, "png"], ["2nd-image", 1, 4,"png"]], M) {
	MouseClickDrag, Left, M.X1, M.Y1, M.X2, M.Y2
}
Return

Далее, к примеру, функция обнаружила изображение 2nd-image3, после чего записала его положение в качестве конечной координаты для перетаскивания. Потом, после перетаскивания, это изображение сменилось на любое другое из заданных, например, 2nd-image1 или 2nd-image4 - это значит, что скрипт закончил работу корректно. Но если изображение осталось прежним, т.е. 2nd-image3 - необходимо повторить MouseClickDrag.

Как добавить в сценарий такое сравнение?