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

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

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

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


ДЛЯ АВТОРОВ:


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

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

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

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

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


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


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

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

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

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

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


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

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

О великий маг, есть ли способ заставить скрипт помнить некоторые данные?
Например при первом запуске и трём нажатиям пользователя на ключ-кнопку создавать текстовый файлик в папке скрипта, в котором будут хранится три переменных?
Не понимаю как в одной переменной хранить координаты курсора и во второй переменной хранить две координаты (начало и конец квадрата).
Всё это надо чтобы при первом запуске определить ключевые точки, по которым будет выполняться скрипт, а при последующих запусках чтобы эти данные считывались из файлика и заново определять ключевые точки не нужно было. Это возможно реализовать или есть более простой способ?

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

1. https://autohotkey.com/docs/commands/FileAppend.htm

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

F1::FileAppend 123456, file.txt


Этот скрипт создал у меня на рабочем столе file.txt с текстом 123456 внутри.


2. Я бы хранил координаты в двух переменных. Если есть способ хранить их в одной, прошу поделиться.


3. Считывание данных из файла с помощью

https://autohotkey.com/docs/commands/FileRead.htm

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

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

Вот у меня записывалка файлика координат в столбик списком под номерами в оконном режиме и в полноэкранном. Управление: на нум1 делает запись, нум2 удаляет файлик с координатами, нум3 закрывает скрипт из системы.
Использую его для получения координат UI на компах друзей, просто так быстрее им пояснить куда и когда кликать.
Вот вобще шикарно было бы научиться хранить и читать данные, можно один раз сделать калибровку и в следующие использовать её. Это довольно критично, когда скрипт работает с 20+ кнопками в игре. Не будешь же для каждой делать по 2 движения каждый раз.

/*

При нажатии Num 1 записывает в текстовый файл координаты курсора в окне и на экране.


удаляет файл с координатами на Num 2.


закрывается на Num 3.

*/



BlockInput, Mouse ; Блокирует ввод мышью на время работы команд


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



Counter = 0 ; Счётчик 1


Text = ,



FileDelete Coords.txt



vk61:: ; Активатор для создания и заполнения файла


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



CoordMode, Mouse, Window ; Привязывает координаты к окну


MouseGetPos, X, Y ; Получает координаты курсора


Counter := Counter+1 ; Увеличение счётчика


If Counter = 1


FileAppend, Координаты курсора в окне и на экране:`n%Counter%: %X%%Text% %Y%, Coords.txt


else


FileAppend, `n%Counter%: %X%%Text% %Y%, Coords.txt



CoordMode, Mouse, Screen ; Привязывает координаты к окну


MouseGetPos, X, Y ; Получает координаты курсора


FileAppend, %Counter%: %X%%Text% %Y%, Coords.txt


Return



vk62:: ; Активатор для удаления файла


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


FileDelete Coords.txt


Counter = 0 ; Обнуление счётчика 1


Return



vk63:: ; Активатор для закрытия скрипта


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


ExitApp


Return

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

Я калибровку делаю просто и сердито.

Если желаемый элемент не имеет постоянных координат,

я встаю на этот элемент курсором и считываю координаты:


F1::MouseGetPos A, B


F2::

;код с использованием координат, например

Click %A% %B%

Return


Таким образом можно настроить место, куда кликает кнопка F2 без редактирования самого скрипта. Просто и без всяких записей в файл.

По поводу считывания из файла - никогда раньше не делал, но наверняка в Интернете есть. Гугл выдал это

https://www.youtube.com/watch?v=eeaVPyb5d2M

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

Таким макаром не получится работать с большим кол-вом элементов с которыми надо вести дела. Работа с инвентарём, скидывание из экипированных элементов брони в инвентарь и обратно - вот это вот всё. Проще один раз составить список из 50 ячеек между которыми будет вестись перетаскивание\обмен и заскриптовать их как константы, чем каждый раз по 50 раз тыкать F1. А там где интерфейс подвижный без этого не обойтись конечно.

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