Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана.

Небольшое продолжение к предыдущему посту

http://pikabu.ru/story/avtomatizatsiya_rutinyi_s_autohotkey_...

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


Давайте попробуем какую-нибудь незатейливую программу, например игрушку сапер.

Научим скрипт реагировать на нашу смерть.

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, Autohotkey, Длиннопост

Делаем скриншот, открываем Пэйнт, и выделяем небольшой кусочек желтой рожицы.

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, Autohotkey, Длиннопост

Обрезаем и сохраняем в файл smert.png. Можно сохранять и в bmp и в jpg, Autohotkey кушает их всех.

Получился вот такой небольшой файлик:

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, Autohotkey, Длиннопост

Этот кусочек изображения и будет искать скрипт.

Теперь нам нужны координаты области на экране, где скрипт будет производить поиск. Можно, конечно, сказать скрипту сканировать весь экран, но это нерационально и наверняка будет приводить к задержкам в работе.

Запускаем этот скрипт:


^F1::

MouseGetPos, X, Y

Tooltip, %X% %Y%

Clipboard = %X%, %Y%

Sleep 1000

Tooltip

Return


При нажатии ctrl+F1 координаты курсора появятся на экране И скопируются в буфер обмена.

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, Autohotkey, Длиннопост

Наша задача: получить координаты вот этой области. А именно - координаты левого верхнего и правого нижнего углов. Подведите кончик курсора к ЛВ углу и нажмите Ctrl F1. Сохраните эти координаты. То же самое с ПН углом. (окно Сапера должно быть активным)

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, Autohotkey, Длиннопост

Теперь создайте следующий скрипт:


F1::

Loop,

{

ImageSearch, xp, yp, 75, 61, 97, 83, *50 smert.png

Sleep 200

If xp > 0

Break

}

MsgBox, Muhaha!

Return


F10::ExitApp

F12::Suspend, Toggle


Если скрипт ничего не находит, то переменным xp, yp присваивается пустое значение, Null.

Если находит, то в них вписываются координаты найденного изображения, срабатывает условие выхода из цикла и запускается следующая часть кода.

*50 отвечает за строгость поиска. *0 максимальная строгость, *255 минимальная.


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

F12 для временного отключения/включения горячих клавиш.


Итак, расположите smert.png в одной папке со скриптом, запустите сапера, нажмите F1, и каждый 200 миллисекунд скрипт будет искать ваш файлик на экране.

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, Autohotkey, Длиннопост

Готово!


Показано, конечно, на пример простой игрушки, но возможности применения поистине безграничны. Автоматизация офисных приложений, игр, промышленность, дизайнерские программы, и т.п. и т.д. на что хватит фантазии.


С уважением, netwizard.

Лига образования

4.4K постов21.8K подписчиков

Добавить пост

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако мы хотим, чтобы соблюдались следующие условия:


ДЛЯ АВТОРОВ:


Приветствуются:

-уважение к читателю и открытость

-желание учиться

Не рекомендуются:

-публикация недостоверной информации


ДЛЯ ЧИТАТЕЛЕЙ:


Приветствуются:

-конструктивные дискуссии на тему постов

Не рекомендуются:

-личные оскорбления и провокации

-неподкрепленные фактами утверждения


В этом сообществе мы все союзники - мы все хотим учиться! :)

Вы смотрите срез комментариев. Показать все
Автор поста оценил этот комментарий

а можно создать скрипт для автоматизации ловли рыбы в игре Torchlight ?

Смысл: надо нажать мышкой на круглую кнопку когда внешнее кольцо соединиться с внутренним

Иллюстрация к комментарию
раскрыть ветку (10)
1
Автор поста оценил этот комментарий

Можно. На сколько помню когда соединяются круги - цвет меняется на более светлый. Сделайте запись видео с высокой частотой кадров и с кадра где круги соединены возьмите скриншот. Дальше как в посте.
Но легче запустить скрипт калибрующий цвет пикселя под курсором. Короче вот:
https://www.youtube.com/watch?v=bh1NRXMeFB0
https://pastebin.com/HDJqNCHb

раскрыть ветку (9)
Автор поста оценил этот комментарий
На сколько помню когда соединяются круги - цвет меняется на более светлый.

да, вроде бы. спасибо

раскрыть ветку (8)
1
Автор поста оценил этот комментарий

Я надеюсь понятно что 100мс приведено как примерное значение? Экспериментируйте и старайтесь держать задержки максимально меньшими - это напрямую влияет на скорость работы скрипта, особенно такого где надо вовремя нажать клавишу.

И всё таки советую посмотреть и допилить по собственному желанию скрипт предложенный по ссылке, благо комментарии к коду там имеются.

раскрыть ветку (7)
Автор поста оценил этот комментарий

пока мне не очень понятно все это программирование скриптов :( но я постараюсь разобраться, если не выйдет, можно будет у вас поспрашивать что не понятно?

раскрыть ветку (6)
1
Автор поста оценил этот комментарий

Скиньте ваш скриншот игры из полного экрана, когда идёт рыбалка. Я посмотрю что я смогу сделать, но ничего не обещаю.

раскрыть ветку (5)
Автор поста оценил этот комментарий

Мне не спалось и я покопался в скриптухе. Не всё так просто, тот что я предложил написан костыльно и на другом компе не сработает. Писать скрипт не проверяя его - весьма трудно, учитывая что играл я давно.
Короче я качаю Торч и запилю скрипт под свою систему, но так, чтобы он работал на всех.
Там много нюансов из-за разной яркости, теней от облаков, разных биомов и не постоянного расположения прудов и соответственно кнопок под них, ну а прозрачность интерфейса добавляет ещё большую попаболь для поиска по пикселю\картинке.
Что мне нужно от вас:
1)Деньги, много денег! Мухахха, я стану богат БОГАТ! (На самом деле не нужно)
2)Разрешение вашего монитора (Скриншот, сохранённый без сжатия в формате BMP, который вы вышлете мне на почту GooEater(собakа)yandex.ru)
3)Название процесса игры, полученное при помощи "Active Window Info (Window Spy)", которая входит в стандартный пакет вместе с AHK (Смотри картинку)
4)Обратная связь, чтобы проконтролировать правильную работу на вашей системе, для этого на почту киньте скайп или дискорд.
Не забудьте указать что вы с пикабу в заголовке письма, иначе пропущу.

раскрыть ветку (4)
1
Автор поста оценил этот комментарий

BlockInput, Mouse ; запрещает пользоваться мышкой, пока ею пользуется скрипт

#SingleInstance force ; запрещает запуск больше 1 скрипта одновременно


CoordMode, Mouse, Window ; привязка координат к активному окну (полному экрану)


#IfWinActive, ahk_class OgreD3D9Wnd ; привязка скрипта к процессу игры



; Надо выставить своё!


ResolutionX := 1920 ; разрешение игрового окна по ширине


ResolutionY := 1080 ; разрешение игрового окна по высоте


; Надо выставить своё!



x1 := null ; координата пруда x


y1 := null ; координата пруда y



MButton:: ; кнопка запуска (Нажать над прудом колёсико, стоя максимально близко к нему)


MouseGetPos, x1, y1 ; получает координаты курсора над прудом


Send, {LButton down}


Sleep 50


Send, {LButton up}


loop {


Sleep 3000


PixelSearch, Px, Py, ResolutionX/2-20, ResolutionY/2+40, ResolutionX/2+10, ResolutionY/2+50, 0x5C5655, 7, Fast ; поиск пикселя в заданном квадрате (0x5C5655 - цвет белой каймы в моей системе)


GetKeyState, state, vk61 ;при удержании (Нум1) останавливает цикл движений мышью


if state = D


{


ToolTip


break


}


else{


if ErrorLevel = 1


{


ToolTip Searching


MouseMove, ResolutionX/2, ResolutionY/2 ; двинем мышь в центр, чтобы далеко не убегала


Sleep 100


}


if ErrorLevel = 0


{


ToolTip Found


sleep 10


MouseMove, ResolutionX/2, ResolutionY/2 ; кликнуть в кнопку, типа поймать


Sleep 10


Send, {LButton down}


Sleep 50


Send, {LButton up}


SoundBeep, 1000, 200 ; оповещение звуком


Sleep 3000


MouseMove, x1, y1 ; двинуть мышь на пруд


Sleep 10


Send, {LButton down}


Sleep 100


Send, {LButton up}


Sleep 100


}


}


}


return



vk60:: ;активатор для закрытия скрипта (Нум0)


SoundBeep, 500, 1000 ; оповещение звуком


ExitApp


Return



vk62:: ;копирует в буфер обмена цвет под курсором в bgr формате (Нум2)


MouseGetPos, MouseX, MouseY


PixelGetColor, color, %MouseX%, %MouseY%


clipboard := color


Return



vk63:: ;4 раза быстро двигает курсор в начало и конец коля в котором ищется пиксель (Нум3)


;курсор должен слегка касаться жёлтого круга в верхнем левом положении и выходить немного за белый в нижнем правом.


MouseMove ResolutionX/2-20, ResolutionY/2+40 10


MouseMove ResolutionX/2+10, ResolutionY/2+50 10


MouseMove ResolutionX/2-20, ResolutionY/2+40 10


MouseMove ResolutionX/2+10, ResolutionY/2+50 10


MouseMove ResolutionX/2-20, ResolutionY/2+40 10


MouseMove ResolutionX/2+10, ResolutionY/2+50 10


MouseMove ResolutionX/2-20, ResolutionY/2+40 10


MouseMove ResolutionX/2+10, ResolutionY/2+50 10


Return

; У меня работает в 70% случаев. Тени, питомец, биом, день\ночь очень влияют на процесс. В скрипте есть всё необходимое чтобы самому его настроить, нум 2 даёт в буфер данные о цвете под курсором. Нум 3 показывает конкретно какая область будет сканироваться. Остаётся только в теле скрипта менять цвет, кол-во градаций цвета и сектор поиска пикселя. Тайминги можно не трогать.

раскрыть ветку (3)
Автор поста оценил этот комментарий

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

координаты области я поменял, но у меня проблема в том что по num2 в буфер всегда копируется 0x000000 куда только не пробовал загонять курсор, всеравно только 0x000000 :(


PS: большое спасибо за ваш труд

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Переделать скрипт не сложно, нужно лишь сменить привязку к процессу, заменить искомый цвет и координаты его поиска. В первую часть я не играл, а качать специально для этого скрипта мне в лом.
В буфер копируется пустой - потому что скрипт не видит окно игры, ведь он привязан к процессу. Ваш кэп ©

Заметил что не прикрепил ранее картинку. Вот она:

Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий

спасибо

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку