Что нового

Поиск пикселя через API

nowost

Знающий
Сообщения
178
Репутация
17
Тестирую код
Код:
#Include <Constants.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>


$Size = WinGetClientSize($hWnd)
$hDC = _WinAPI_GetDC($hWnd)
$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
$hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
_WinAPI_BitBlt($hMemDC, 0, 0, $Size[0], $Size[1], $hDC, 0, 0, $SRCCOPY)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_ReleaseDC($hWnd, $hDC)

; Здесь у тебя есть готовый битмап ($hBitmap), делай с ним что хочешь!


; Ищем точку с цветом 0x87BEF5 (RGB)
$ARGB = _WinAPI_IntToDWord(BitOR(0x87BEF5, 0xFF000000))
$L = $Size[0] * $Size[1]
$tBits = DllStructCreate('dword[' & $L & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
$Timer = TimerInit()
$Offset = -1
For $i = 1 To $L
    If DllStructGetData($tBits, 1, $i) = $ARGB Then
        $Offset = $i
        ExitLoop
    EndIf
Next
ConsoleWrite('API' & @CR)
ConsoleWrite(TimerDiff($Timer) & @CR)
If $Offset = -1 Then
    ConsoleWrite('Not Found!' & @CR)
Else
    ConsoleWrite('X = ' & Mod($Offset, $Size[0]) - 1 & @CR)
    ConsoleWrite('Y = ' & Ceiling($Offset / $Size[0]) - 1 & @CR)
EndIf

ConsoleWrite('' & @CR)
;----------------------------------------

Если искомый пиксель находится скажем вверху приложения, то скорость определения через API составляет 0,2....0.5 сек (PixelGetColor воообще не рассматриваю т.к он очень тупит)
Если пиксель находится внизу приложения, скорость определения пикселя через API примерно 6-7сек.
Тестировал на Вин7 х86 1920х1080 С Аеро без аеро (не сильно влияло на скорость поиска)
Пробовал на виртуалке (варя7) ВинХР СП3 800х600 1024х768 результаты времени оставались примерно теже.
Это нормальная скорость или у меня чтото не так с системой?
Насколько я понимаю ускорения можно добиться за счет сужения зоны поиска пикселя, можно ли это реализовать через API , если можно пример?
И еще один вопрос если приложение динамически изменяется, скажем игра, то пиксель вовсе не находит, почему такое может быть ?
 
Автор
N

nowost

Знающий
Сообщения
178
Репутация
17
кому нужно, как ограничить область поиска API нашел вот в это теме http://autoit-script.ru/index.php/topic,4462.0.html всеравно ускорения не удалось добиться. Такое ощущение что сам битмап очень долго создается а поиск происходит быстро.
пока PixelSearch работает у меня намного быстрее даже в цикле.
 
Верх