Что нового

PixelSearch() для всех точек

yukuru

Влюбленный Бродячий Кот
Сообщения
48
Репутация
4
функция PixelSearch(x,y, color) останавливается только когда найдет первый соотвествующий пиксель....
можно ли сделать такЪ что бы для зданной области он нашел ВСЕ соотвесвующие пиксели?
 

edward_freedom

Осваивающий
Сообщения
200
Репутация
44
функция PixelSearch(x,y, color)
:shok: :shok: :shok: :shok:
Код:
PixelSearch ( left, top, right, bottom, color [, shade-variation [, step [, hwnd]]] )


Код:
while 1
$coord = PixelSearch( 0, 0,1024, 768, 0x808083)
	If Not @error Then
      MouseMove($coord[0], $coord[1])
  EndIf
  wend
 
Автор
Y

yukuru

Влюбленный Бродячий Кот
Сообщения
48
Репутация
4
ЗАчем этот код? он совсем не несет той информационной нагрузке что требовалось.

он постоянно будет находить одну и туже точку и на ней останавливаться...... а остальные ???
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
yukuru,
Попробуйте так.
1. Дольше (но с оттенками):
Код:
#include <Array.au3>

Opt('PixelCoordMode', 2)
Opt('WinTitleMatchMode', 2)

HotKeySet('{Esc}', '_Exit')

Dim $aResult[1001][2] = [[1000]]
$iCount = 0
$iColor = 0x000000
$iX = 0
$iY = 0
$iVariation = 10 ;чем больше, тем больше найдет
$sTitle = 'AutoIt v3 Window Info' ;заголовок Вашего окна

$hWin = WinWait($sTitle, '', 3)
If Not $hWin Then
	MsgBox(16, 'Error', 'Нет такого окна')
	Exit
EndIf
If Not WinActive($hWin) Then
	WinActivate($hWin)
	WinWaitActive($hWin)
EndIf
$aPos = WinGetPos($hWin)
$aMax = WinGetClientSize($hWin)
If $aPos[0] < 0 Or $aPos[1] < 0 Or ($aPos[0] + $aPos[2]) > @DesktopWidth Or _
		($aPos[1] + $aPos[3]) > @DesktopHeight Then
	WinMove($hWin, '', 0, 0)
	$aPos = WinGetPos($hWin)
	$aMax = WinGetClientSize($hWin)
EndIf
$iX_k = $aPos[0] + ($aPos[2] - $aMax[0]) / 2
$iY_k = $aPos[1] + ($aPos[3] - $aMax[1]) - ($aPos[2] - $aMax[0]) / 2
$iX_max = $aMax[0]
$iY_max = $aMax[1]
ToolTip('Ищем здесь', 0, 0)
MouseMove($iX_k, $iY_k)
Sleep(1000)
MouseMove($iX_k, $iY_k + $aMax[1])
Sleep(1000)
MouseMove($iX_k + $aMax[0], $iY_k + $aMax[1])
Sleep(1000)
MouseMove($iX_k + $aMax[0], $iY_k)
Sleep(1000)
MouseMove($iX_k, $iY_k)
ToolTip('', 0, 0)
$iStart = TimerInit()
While 1
	If Not WinExists($hWin) Then ExitLoop
	If Not WinActive($hWin) Then
		WinActivate($hWin)
		WinWaitActive($hWin)
	EndIf
	PixelSearch($iX, $iY, $iX, $iY, $iColor, $iVariation, 1, $hWin)
	If Not @error Then
		$iCount += 1
		ToolTip($iCount & @LF & $iY & 'x' & $iY, 0, 0)
		If $iCount = $aResult[0][0] Then
			$aResult[0][0] += 1000
			ReDim $aResult[$aResult[0][0] + 1][2]
		EndIf
		$aResult[$iCount][0] = $iX
		$aResult[$iCount][1] = $iY
		MouseMove($iX + $iX_k, $iY + $iY_k, 0)
	EndIf
	$iX += 1
	If $iX = $iX_max Then
		$iX = 0
		$iY += 1
		If $iY = $iY_max Then ExitLoop
	EndIf
WEnd
ToolTip('', 0, 0)
$sTime = StringFormat('%.2f sec', TimerDiff($iStart) / 1000)
If $iCount Then
	ReDim $aResult[$iCount + 1][2]
	$aResult[0][0] = $iCount
	$aResult[0][1] = $aMax[0] & 'x' & $aMax[1]
	;В массиве координаты относительно клиентской части окна
	_ArrayDisplay($aResult, $sTime)
Else
	MsgBox(16, 'Error', 'Нет такого цвета' & @LF & $sTime)
EndIf
Func _Exit()
	Exit
EndFunc   ;==>_Exit
2. Быстрее (но без оттенков):
Код:
#include <Array.au3>

Opt('PixelCoordMode', 2)
Opt('WinTitleMatchMode', 2)

HotKeySet('{Esc}', '_Exit')

Dim $aResult[1001][2] = [[1000]]
$iCount = 0
$iColor = 0x000000
$iX = 0
$iY = 0

$sTitle = 'Мои документы' ;заголовок Вашего окна
$hWin = WinWait($sTitle, '', 3)
If Not $hWin Then
	MsgBox(16, 'Error', 'Нет такого окна')
	Exit
EndIf
If Not WinActive($hWin) Then
	WinActivate($hWin)
	WinWaitActive($hWin)
EndIf
$aPos = WinGetPos($hWin)
$aMax = WinGetClientSize($hWin)
If $aPos[0] < 0 Or $aPos[1] < 0 Or ($aPos[0] + $aPos[2]) > @DesktopWidth Or _
		($aPos[1] + $aPos[3]) > @DesktopHeight Then
	WinMove($hWin, '', 0, 0)
	$aPos = WinGetPos($hWin)
	$aMax = WinGetClientSize($hWin)
EndIf
$iX_k = $aPos[0] + ($aPos[2] - $aMax[0]) / 2
$iY_k = $aPos[1] + ($aPos[3] - $aMax[1]) - ($aPos[2] - $aMax[0]) / 2
$iX_max = $aMax[0]
$iY_max = $aMax[1]
ToolTip('Ищем здесь', 0, 0)
MouseMove($iX_k, $iY_k)
Sleep(1000)
MouseMove($iX_k, $iY_k + $aMax[1])
Sleep(1000)
MouseMove($iX_k + $aMax[0], $iY_k + $aMax[1])
Sleep(1000)
MouseMove($iX_k + $aMax[0], $iY_k)
Sleep(1000)
MouseMove($iX_k, $iY_k)
ToolTip('', 0, 0)
$iStart = TimerInit()
While 1
	If Not WinExists($hWin) Then ExitLoop
	If Not WinActive($hWin) Then
		WinActivate($hWin)
		WinWaitActive($hWin)
	EndIf
	If PixelGetColor($iX, $iY, $hWin) = $iColor Then
		$iCount += 1
		ToolTip($iCount & @LF & $iX & 'x' & $iY, 0, 0)
		If $iCount = $aResult[0][0] Then
			$aResult[0][0] += 1000
			ReDim $aResult[$aResult[0][0] + 1][2]
		EndIf
		$aResult[$iCount][0] = $iX
		$aResult[$iCount][1] = $iY
		MouseMove($iX + $iX_k, $iY + $iY_k, 0)
	EndIf
	$iX += 1
	If $iX = $iX_max Then
		$iX = 0
		$iY += 1
		If $iY = $iY_max Then ExitLoop
	EndIf
WEnd
ToolTip('', 0, 0)
$sTime = StringFormat('%.2f sec', TimerDiff($iStart) / 1000)
If $iCount Then
	ReDim $aResult[$iCount + 1][2]
	$aResult[0][0] = $iCount
	$aResult[0][1] = $aMax[0] & 'x' & $aMax[1]
	;В массиве координаты относительно клиентской части окна
	_ArrayDisplay($aResult, $sTime)
Else
	MsgBox(16, 'Error', 'Нет такого цвета' & @LF & $sTime)
EndIf
Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Автор
Y

yukuru

Влюбленный Бродячий Кот
Сообщения
48
Репутация
4
вроде работает. с кодом разберусь.
спасибо
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
yukuru,
Я поменял второй вариант (Быстрее). Оказалось, что простым +- всех оттенков, которые находит PixelSearch() не задать.
 
Верх