Автоматизация рутины с 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 подписчиков

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

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

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


ДЛЯ АВТОРОВ:


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

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

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

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

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


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


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

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

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

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

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


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

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

@moderator, нельзя ли перенести этот пост в Лигу Образования? Не могу сделать это при помощи редактирования.

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

Можешь мне помочь с ImageSearch  и кодом в целом  ?

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

Попробую.

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

В общем хочу сделать ротацию скилов, когда у скила кд то его иконка становиться  темноватой и через ImageSearch устанавливается уровень ошибки то-есть если у скила  в данный момент нет кд то errorlevel = 0 и выполняется действие Send (1) а если иконка темная то алгоритм дальше идет через else к следующему ImgeSearch. Проблема в том что у меня никак не находиться изображение

Вот код

#SingleInstance Force

#NoEnv

SetWorkingDir, D:\DADADADA

SendMode Input

CoordMode Pixel


$NumPad2::

Loop

{

ImageSearch, FoundX, FoundY, 458, 913, 491, 948, *20 Fire.bmp

if ErrorLevel = 0

{


Send 1

Sleep 50

}

else

{

MsgBox not found

ImageSearch FoundX, FoundY, 470, 913, 505, 1012, *20 1stskill.bmp

if errorLevel = 0

{

Send 2

Sleep 50

}

}

Sleep 100

return

}

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

1. Тестировали в других приложениях? В том же сапере, например?

2. Выньте из своего кода проблемный участок и потестите его отдельно. Допустим,


F8::

ImageSearch FoundX, FoundY, 470, 913, 505, 1012, *20 1stskill.bmp

if errorLevel = 0

tooltip, ok!

Return


Так вы поймете где проблема, из-за того что imagesearch не находит картинку или в другой части кода.

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

Вообще я уже справился в общемто сделал следующие выводы минимальная область поиска должна быть на ~30% больше искомого изображения, само изображение должно быть статичным или использовать n* TransN и еще оно должно быть как можно меньше  тестировал я так

ImageSearch FoundX, FoundY, 470, 913, 505, 1012, *20 1stskill.bmp

if errorLevel = 1
MsgBox, not found
Потом просто 2 вместо единицы подставлял :D

1
Автор поста оценил этот комментарий

а не проще такую фигню сделать с помощью того же Clickermann? там и поменьше строк будет для такой незатейливой задачи.

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

Я лишь делюсь своим опытом. Я не ставлю задачу "отыскать наиболее простой для новичка путь и объяснить его".

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

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