Что нового

Анализ изображения в неактивном окне

tampax911

Новичок
Сообщения
3
Репутация
0
Прошу помочь знающих людей. То, что в AutoIt можно посылать клики мыши в неактивное окно знаю, и считаю очень полезным, но есть ли возможность реализовать поиск пикселей в неактивном окне? Например сделав с него скриншот (не разворачивая окно) и анализировать его ? Если можно, то куда копать ? Заранее спасибо.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Встроенными средствами автоит нельзя. Далее все зависит от игры.
 

lirikmel

Продвинутый
Сообщения
226
Репутация
84
Код:
Func _WinAPI_PixelGetColor($x, $y, $titl, $klass) ;работает в неактивном(активном) окне с визуально видимыми точками
    Local $Struct = DllStructCreate("int X;int Y")
    $Ckoord = ControlGetPos( $titl, "", $klass) ; тут привязаться к окну и элементу окна
    $Wkoord = WinGetPos( $titl )                ; чтоб координаты стали относительные
    $WClient = WinGetClientSize( $titl )                ; клиентская часть окна
    $iBorder = ($Wkoord[2] - $WClient[0]) / 2 ;получаем ширину бордюра
    $iCaption = ($Wkoord[3] - $WClient[1]) - $iBorder ;получаем высоту заголовка окна
    $iX = $x + $Ckoord[0] + $Wkoord[0] + $iBorder       ; пересчет на относительные координаты
    $iY = $y + $Ckoord[1] + $Wkoord[1] + $iCaption      ; с учетом бордюра(4?) и титульной строки (23?)
    DllStructSetData($Struct, "X", $iX)
    DllStructSetData($Struct, "Y", $iY)
    _WinAPI_ScreenToClient($titl, $Struct)
    $iX = DllStructGetData($Struct, "X")
    $iY = DllStructGetData($Struct, "Y")
    $c = PixelGetColor ($iX, $iY)
    Return $c ;возвращает цвет точно такой же как и PixelGetColor
EndFunc

проще воспользоваться опцией PixelCoordMode
Код:
Func _WinAPI_PixelGetColor($iX, $iY, $vTitle, $vCtrlID) ;работает в неактивном(активном) окне с визуально видимыми точками
    Local $iOpt = Opt("PixelCoordMode", 0)
    Local $hControl = ControlGetHandle($vTitle, "", $vCtrlID)
    If @error Then Return SetError(1, 0, 0)
   
    Local $nColor = PixelGetColor($iX, $iY, $hControl)
    Opt("PixelCoordMode", $iOpt)
    Return $nColor
EndFunc


что касается скриншота свернутого окна...то у меня на win 7 _Wincapture не работатает



по подробнее тут написано http://autoit-script.ru/index.php/topic,1057.15.html
 

shm_alex

Новичок
Сообщения
34
Репутация
4
tampax911 сказал(а):
Например сделав с него скриншот (не разворачивая окно) и анализировать его ?
На сколько я понимаю что скриншот - это копия видео памяти если рисунка окна нет в видео-памяти то и анализировать нечего.
А если нужно сворачивать окно и чтоб начальник не видел как бот на рабочей машине копается. То предлагаю завести виртуальную машину, и уже виртуальную машину сворачивать. Я не знаю как там всё работает у виртмашины но могу только предполагать что видеопамять вирт машин эмулируется при помощи обычной памяти компа. В общем PixelSerch запущенный на свёрнутой виртуальной машине прекрасно ищет пиксели ))) да и MouseClick тыкает нормально без отрыва от производства.
Мои поделки прекрасно работают на VMware Workstation
Да придётся смирится с некоторыми тормозами у основных приложений .И покопаться с установкой вирт машины.
Возможно поставить сисадмину пиво , чтоб плашку памяти лишнюю в машинку вставил.
Наверно можно спрятать окно чтоб не мешалось и при помощи какого нить расширенного десктопа или заэмулировать второй экран (на нутбуке или видеокарточке которой моно второй экран цеплять). но я не представляю как это сделать.
Или ты хочешь сделать зомби бота который будет распространятся как вирус по сети и работать на компьютерах ничего не подозревающих обывателей не втянутых в сети MPORPG .

А ещё прикольно поиграть с прозрачностью Окна(Transparensy) при низких значениях прозрачности окно практически не видно И автокликеры прекрасно тыкают по активизированному окну с прозрачностью >0 (когда у окна прозрачность ==0 скрипт по нему тыкать перестаёт). Теоретически наверно можно наверно восстановить цвет непрозрачного окна видя картинку с наложенной прозрачной картинкой и зная какая картинка была до наложения. И для для восстановленной картинки уже искать нужные тебе пиксели... Но это всё очень затратные операции , да и пикселсёрч нужно будет переписать для памяти.

Интересно а можно переопределить ввод(ну это понятно можно )/вывод для винды, и выводить не на экран в окно приложения а в память, для стороннего процесса ?
 

desferk

Новичок
Сообщения
11
Репутация
0
А разве не проще все это делать через поинтеры и оффсеты -)
Не проще ли выбирать моба через "ближайшая цель"
и заставить бота читать координаты и двигаться по вейпоинтам...
пиксель серч канает там где ошибки допустимы -) + его работа не точна
За неделю можно с нуля научится всему этому - правда если очень захотеть...
:IL_AutoIt_1:
 
Верх