Что нового

[Мышь, клавиатура] Долгое выполнение PixelSearch

deffol

Новичок
Сообщения
22
Репутация
0
Вот такой скрипт сочинил:

......................
Код:
Dim $aResult[1001][2] = [[1000]], $X = 604, $Y = 162, $Right = 976, $Bottom = 715, $iColor = 0x000000
$iCount = 0

.....................
Код:
For $j = $Y To $Bottom
   For $i = $X To $Right
	  PixelSearch($i, $j, $i, $j, $iColor, 5, 1, $hWin)
if Not @error Then
		 $iCount += 1
		 MouseClick("Left", $i, $j, 1, 0)
		 If $iCount = $aResult[0][0] Then
			$aResult[0][0] += 1000
			ReDim $aResult[$aResult[0][0] + 1][2]
		 EndIf
		 $aResult[$iCount][0] = $i
        $aResult[$iCount][1] = $j
	  EndIf
   Next
Next


В общем как видите идет поиск пикселей по заданному пространству, если пиксел найден производится нажатие мышкой, ну и массив, чтоб предыдущие пикселы не трогал скрипт.

Я расчитывал на то, что допустим на черный пиксел в заданном пространстве будет произведен мгновенное нажатие, а получилось, что идет поиск пикселей от X, Y до R.., B.., и если будет черный - нажмет. И это занимает уйму времени...
Может я что-то не так написал (?), помогите найти ошибку.


Добавлено:
Сообщение автоматически объединено:

то есть поиск должен быть очень быстрый, а скорость такая будто происходит не PixelSearch, а MouseClick
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Похоже скрипт неправильно построен...
А какой смысл так писать?
Код:
PixelSearch($i, $j, $i, $j, $iColor, 5, 1, $hWin)

Для начало посмотри это http://autoit-script.ru/autoit3_docs/functions/PixelSearch.htm
И вообще PixelSearch() Может сканировать сразу область экрана.
По пробуй убрать свои чертовы циклы:
Код:
$Poz = PixelSearch( $X, $Y, $Right, $Bottom, $iColor, 5, 1, $hWin)
if IsArray($Poz) Then
   MouseClick("Left", $Poz[0], $Poz[1], 1, 0)
EndIf
 

running-frag

why me?
Сообщения
441
Репутация
60
ты координаты для PixelSearch не меняешь, у тебя они один пиксель что есть ошибка

upd:
это равносильно PixelGetColor (), у тебя подход изначально не правильный
 
Автор
D

deffol

Новичок
Сообщения
22
Репутация
0
Ganibal95, с Вашим вариантом получилось сразу найти пиксель, но не получается массив так прикрутить, чтоб нажимал на все пиксели в данных координатах без повторных нажатий


Добавлено:
Сообщение автоматически объединено:

running-frag [?]
ты координаты для PixelSearch не меняешь, у тебя они один пиксель что есть ошибка

подскажите как их менять :-[
 

running-frag

why me?
Сообщения
441
Репутация
60
deffol [?]
подскажите как их менять
Код:
Local $_x = 100 ; точка отсчёт по x
Local $_y = 100 ; точка отсчёт по y
Local $_w = 100	; ширина квадрата width
Local $_h = 100 ; высота квадрата height
Local $_color = 0xFFFFFF

Local $_result

$_result = PixelSearch($_x, $_y, $_x +$_w, $_y +$_h, $_color)
If @error Then
	MsgBox ("nothing found"&@CR)
Else
	MsgBox ("founded at "& $_coord[0] &""& $_coord[1] &""&@CR)
	MouseMove ($_coord[0], $_coord[1] , 5)
Next

Скрипт ищёт в заданной зоне (квадрат) где $_x и $_y нулевые координаты.

Если непонятно, ЕЩЁ раз перечитай описание функции PixelSearch ().
 
Автор
D

deffol

Новичок
Сообщения
22
Репутация
0
running-frag, спасибо, понял примерно, получилось, сразу же находит пиксел и кликает на него.

Вот Ganibal95, посоветовал убрать циклы, но как без них еще объяснить скрипту, чтоб он нажал на абсолютно все пиксели, а не только на один? я решил не использовать массив, чтоб не нажимал предыдущие пикселы, он мне оказывается и не нужен, но как реализовать эту идею с нажатием всех пикселей в окне?
 

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
Код:
HotKeySet('`', 'fu')
$top= 367
$left = 263
$right = 286
$max = 382
While 1
	Sleep(100)
WEnd
Func fu()
	While 1
		$pi = PixelSearch($left, $top, $right, $top, 0x000000)
		If Not @error Then
			ConsoleWrite($pi[0]&','&$pi[1]&@CRLF)
			MouseMove($pi[0], $pi[1])
			$left = $pi[0] + 1
		Else
			$top = $top + 1
			If $top = $max Then Exit
			$left = 263
		EndIf
		Sleep(200)
	WEnd
EndFunc
 
Автор
D

deffol

Новичок
Сообщения
22
Репутация
0
sngr, спасибо большое, наконец дошло :smile:
единственное не совсем понял для чего в конце поставили left = 263 :scratch:....но думаю разберусь, еще раз спасибо всем большое! :-[
 

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
Смотри внимательней. Это построчный поиск слева направо и сверху вниз. Если мы находим пиксель, следующий PixelSearch будет идти от горизонтальная координата пикселя +1. Поиск дошёл до конца строки - ищем на строку ниже, а левая координата осталась от последнего найденого пикселя. $left = 263 это перевод переменной на начальное положение, чтобы поиск вёлся с начала строки. Открой paint, наставь там точек, ограничь область и смотри как это работает.
 
Верх