Что нового

Получение координат для клика по виду области

PACHOM

Новичок
Сообщения
99
Репутация
0
Здравствуйте!

Подскажите пожалуйста, возможно ли найти не один пиксель в определённой области, а набор пикселей? К примеру есть кнопка, вид которой уникален. Можно ли получить координаты этой кнопки для последующего клика по ней?
Информацию по окну, в котором расположена кнопка. получить не получается (могу получить только заголовок и класс окна). По этой причине и делаю финт ушами в области работы с мышкой и поиском кнопок по "внешнему виду" :smile:

С уважением,
ПАХОМ
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
PACHOM [?]
не один пиксель в определённой области, а набор пикселей?
После нахождения первого пикселя с помощью PixelSearch задаёшь поиск в следующем пикселе соответствие с заданным, если да, то следующего, и так пока все пикселы не будут соответствовать.


Можно ли получить координаты этой кнопки для последующего клика по ней?
PixelSearch - Возвращает двух-элементный массив с координатами пикселя.
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
А это не будет слишком долго? Не больше минуты? Область поиска окно размером 800х600.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
PACHOM
PACHOM сказал(а):
А это не будет слишком долго?
Размер первого бокса в котором искать - размер экрана, а размер последующих боксов - размер одного пикселя. И кстати, можно через 1 или даже через 3 пикселя прыгать, потому что вероятность совпадения разных рисунков при совпадении каждого третьего бесконечно мала.
А может после нахождения первого вызвать PixelChecksum? Может так быстрее ну или после нахождения 2-3 пикселов.

И да, время выполнения вы можете проверить
Код:
$timer = TimerInit()
 ; измеряемый код.
MsgBox(0, "Время выполнения", 'Время : ' & Round(TimerDiff($timer) / 1000, 2) & ' сек')
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
PACHOM

Можно через скриншоты:
1) скрин кнопки сделать заранее (обрезать его, чтобы был набор уникальных пикселей) В теории скрин можно хранить в скрипте в виде строки
2) скрипт будет делать скрин нужного окна и искать набор пикселей из скрина кнопки.

Код:
#include <GDIPlus.au3>
#include <ScreenCapture.au3>

_GDIPlus_Startup()
$hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\1.png') ; сделанный заранее скриншот кнопки
$Width = _GDIPlus_ImageGetWidth($hBitmap)
$Height = _GDIPlus_ImageGetHeight($hBitmap)
$tMap = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $Width, $Height, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$bData1 = DllStructGetData(DllStructCreate('byte[' & ($Width * $Height * 4) & ']', DllStructGetData($tMap, 'Scan0')), 1)
_GDIPlus_BitmapUnlockBits($hBitmap, $tMap)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
$bData1 = StringTrimLeft($bData1, 2)

$countstring = StringMid($bData1, 1, $Width * 8)
;ConsoleWrite($countstring & @CR)

_GDIPlus_Startup()

$hBmp = _ScreenCapture_CaptureWnd('', WinGetHandle('[CLASS:SciTEWindow]', '')) ; получаем скриншот окна

$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
$Width = _GDIPlus_ImageGetWidth($hBitmap)
$Height = _GDIPlus_ImageGetHeight($hBitmap)

$tMap = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $Width, $Height, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$bData2 = DllStructGetData(DllStructCreate('byte[' & ($Width * $Height * 4) & ']', DllStructGetData($tMap, 'Scan0')), 1)
_GDIPlus_BitmapUnlockBits($hBitmap, $tMap)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
$bData2 = StringTrimLeft($bData2, 2)
;ConsoleWrite($bData & @CR)

$sTring1 = StringInStr($bData2, $countstring) ; поиск по верхней строке

If $sTring1 > 0 Then
	$y = (Ceiling($sTring1 / $Width) - 1) / 8
	$x = (Mod($sTring1, $Width) - 1) / 8
	ConsoleWrite($x & ' ' & $y & @CR)
	Opt('MouseCoordMode', 0)
	MouseClick('left', $x, $y)
Else
	ConsoleWrite('Not Found!' & @CR)
EndIf
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
ООоооооо!!! Крутро! Я попробую! :smile: Спасибо!!! Обязательно отпишусь!
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
Здравствуйте!

Попробовал. Скорость впечатлила. Но ... кликает в итоге скрипт не в то окно. Почему ... сижу разбираюсь (если что, то я класс окна переписал и сделал скриншот кнопки).
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
Спасибо :smile:

Картинки те что в папке находит, а те что я делаю скриншотом нет. Почему это может быть?

Спасибо.


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

Стоп! Вопрос решён: в папке со скриптом должен быть скрин иконки, а я её на рабочем столе сохранил только.

Благодарю Вас за помощь!
 
Автор
P

PACHOM

Новичок
Сообщения
99
Репутация
0
Здравствуйте!

К сожалению на работе находит только иконку корзины. Все остальные иконки он не находит (имеется ввиду иконки используемые для тестирования скрипта). Возможно имеет значение: MS Windows XP Professional SP3.


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

1. Работает если активировать окно содержащее искомую кнопку. Вопрос: можно ли как-то это исправить?
2. Как искать только в указанном окне программы?
 
Верх