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

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

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

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


ДЛЯ АВТОРОВ:


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

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

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

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

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


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


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

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

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

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

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


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

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

@netwizard подскажи пожалуйста. Второй день не могу разобраться, написал скрипт для браузера с поиском кнопок. На странице нужно найти кнопку, нажать и перейти на следующую страницу, на второй странице нужно найти другую кнопку и нажать её и так далее. ImageSearch в первый раз срабатывает, на второй и третий отказывается что-либо делать. Его можно объявить только один раз?

Сделал как-то так:

^F1::


loop,

{

ImageSearch, x, y, 1732, 519, 1769, 606,*50 lupa.png

Sleep, 300


Send, {Control down}

MouseClick, left, x, y

Send, {Control up}

Sleep, 800

Send ^{Tab}

Sleep, 300

Send {End}

Sleep, 800


ImageSearch, findx, findy, 618, 979, 1237, 1020,*150 pogasit.png

Sleep, 300


MouseClick, left, findx, findy

Sleep, 3000

Send {End}

Sleep, 500


ImageSearch,finddx, finddy, 697, 984, 1206, 1018,*150 sohranit.png

Sleep, 300


MouseClick, left, finddx, finddy

Sleep, 3000

Send ^{vk57}

Sleep, 1000

Click, 767, 308

Sleep, 2000


}


return

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

Блок команд для каждой страницы нужно убирать в конструкции

If <условие>

{

<команды>

}


Иначе получается что скрипт заходит на первую страницу, выполняет команды, предназначенные для первой страницы И второй И третьей, затем начинает снова.


ImageSearch, x, y, 1732, 519, 1769, 606,*50 lupa.png


If x>0    ;если скрипт не нашел лупу, то иксу  присвоится пустое значение, условие не выполнится

              ;и блок команд не будет выполняться. То, что нужно

{

Sleep, 300

Send, {Control down}

MouseClick, left, x, y

Send, {Control up}

Sleep, 800

Send ^{Tab}

Sleep, 300

Send {End}

Sleep 800

}

--------------------------------------------

Далее. Проверял второй и третий imagesearch по отдельности?


F6::

ImageSearch,finddx, finddy, 697, 984, 1206, 1018,*150 sohranit.png

if finddx>0

MsgBox, OK

Return


при нажатии F6 выдает ОК?

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

Спасибо! Все заработало.

А правильно ли использовать Sleep'ы? Я напихал их, т.к. боюсь что страница не прогрузится и он мимо нажмет.

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

Если время не критично, например скрипт работает, а вы ушли, то можно напихать слипов побольше, чтобы перестраховаться.

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

Как скрипт будет понимать когда страница прогрузилась - либо через тот же ImageSearch, либо через WinWaitActive.

Когда браузер перейдет на другую страницу, у него наверняка поменяется заголовок. Вот скриптик для считывания заголовков:


^F2::

WinGetActiveTitle, Title

MsgBox, %Title%

Clipboard = %Title%

Return


потом делаете так


MouseClick, left, x, y

WinWaitActive, Сайт Вани Пупкина

Send ^{Tab}


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

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