Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана.
За прошедший год мое владение скриптами немного улучшилось, в частности, теперь я могу научить скрипт распознавать изображение на экране, искать всякие кнопки, рисунки и т.д.
Давайте попробуем какую-нибудь незатейливую программу, например игрушку сапер.
Научим скрипт реагировать на нашу смерть.
Делаем скриншот, открываем Пэйнт, и выделяем небольшой кусочек желтой рожицы.

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

Этот кусочек изображения и будет искать скрипт.
Теперь нам нужны координаты области на экране, где скрипт будет производить поиск. Можно, конечно, сказать скрипту сканировать весь экран, но это нерационально и наверняка будет приводить к задержкам в работе.
Запускаем этот скрипт:
MouseGetPos, X, Y
При нажатии ctrl+F1 координаты курсора появятся на экране И скопируются в буфер обмена.

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

Теперь создайте следующий скрипт:
ImageSearch, xp, yp, 75, 61, 97, 83, *50 smert.png
Если скрипт ничего не находит, то переменным xp, yp присваивается пустое значение, Null.
Если находит, то в них вписываются координаты найденного изображения, срабатывает условие выхода из цикла и запускается следующая часть кода.
*50 отвечает за строгость поиска. *0 максимальная строгость, *255 минимальная.
F10 нужен для аварийного выхода из скрипта если вы вдруг создадите бесконечный скрипт, блокирующий ваши действия.
F12 для временного отключения/включения горячих клавиш.
Итак, расположите smert.png в одной папке со скриптом, запустите сапера, нажмите F1, и каждый 200 миллисекунд скрипт будет искать ваш файлик на экране.

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

3.3K постов 20.4K подписчик
Правила сообщества
Публиковать могут пользователи с любым рейтингом. Однако мы хотим, чтобы соблюдались следующие условия:
ДЛЯ АВТОРОВ:
Приветствуются:
-уважение к читателю и открытость
Не рекомендуются:
-публикация недостоверной информации
ДЛЯ ЧИТАТЕЛЕЙ:
Приветствуются:
-конструктивные дискуссии на тему постов
Не рекомендуются:
-личные оскорбления и провокации
-неподкрепленные фактами утверждения
В этом сообществе мы все союзники — мы все хотим учиться! 🙂
Смотрю на всё это дело и вспоминаю себя лет эдак 4-5 назад 🙂
когда в diablo 3 ещё был аукцион, я запилил бота на «горячих клавишах». С 3D у него есть небольшие проблемы для распознования — но это не критично было. суть в том что бот сам за меня бегал на боса и выбивал мне дроп с голдой:)) буквально недавно решил вспомнить старые добрые и запилил на blueStacks ( эмулятор андроида ) автоматизацию игры пианино, не помню как она называется ( в крадце с верха экрана «падают» чёрные прямоугольники имитирующие ноты и на них надо нажимать до того момента пока они не скрылись под экраном, что то на подобие гитархиро) и только тогда я понял как ребята в топе рейтинга там набивают такие огромные количества очков — скорость «падения» нот приближалась к сверхпиксельной и сами ноты практически не видно — чтоб самому нажать и попасть по ним я вообще молчу 😀
Я помню на autohotkey писал скрипт для фарма ресурсов в одной гриндилке на 5 персонажей, через распознавание цвета пикселей на мини-карте. 5 персонажей гуськом бежали на место добычи ресурсов, копали, умирали, оживали и бежали дальше. Жуткое было зрелище со стороны.
Я правильно понял, что координаты берутся относительно экрана, а не окна программы и в случае если сдвинуть окно программы, то скрипт не сработает?
Ответ на пост «Как автоматизировать однотипную, монотонную работу бесплатно и без навыков программирования»
Эх, сколько раз меня выручала автоматизация! Вспомнил тут пару случаев. (если что то использую скрипты в AutoHotkey (AHK)).
Первый был когда еще в органах работал. Начальство придумало — а давайте все фабулы дел вносить в базу данных. При этом база данных не воспринимала копировать-вставить (что тупо), но база не публичная и вход через матюки и старый интернет эксплорер, так что работали как есть. Сидишь, придумываешь как это сократить и потом впечатываешь. Особенно сильно негодовали мы с другом, так как у нас были не перспективные дела (в отделе на каждого следака было по 10 дел в месяц, а у нас с ним напару под сотню, именно чтобы разгрузить остальных). И нам печатать было больнее всего. И тут я вспомнил про АНК и что он умеет печатать из буфера обмена — т.е. для меня это было копировать-вставить, а база воспринимала это словно я напечатал. Экономия во времени была колоссальная.
Второй момент был в учётке — меня молодого специалиста посадили править табличку учёта личных дел. Табличка была уже не помню в какой проге, но она тоже была с приветом. Там было около 20 000 позиций, где нужно было руками убирать пару символов в начале. И нельзя скопировать никуда (в эксель например), только работать руками. Дурь. Времени начальство выделило 2 дня, типа сиди молодой, правь строчки. Ну я два дня и использовал: 20 минут шаманства со скриптом, и уютное чтение книжки под чаек на этот и следующий день, пока строчки сами себя правят. Помню в середине процесса напарник пришел и запаниковал чего это я не работаю)
Да и мелкие задачи, если их можно автоматизировать, тоже переносятся в АНК. Из того что помню:
— тоже из учётки. Перешла к нам в отдел женщина, которая в работе разбиралась но с пк была на Вы. Очень мне не нравилось что она постоянно просила меня подойти и поставить апостроф, т.к. у неё не получалось (много раз в день, Карл!). На очередную просьбу я просто сделал ей скрипт который этот апостроф ставит по нажатию на Pause, а на клавиатуру напечатал на самоклейке этот апостроф и на эту кнопку наклеил.
— люблю смотреть видео из ютуба, предварительно скачивая их на телефон. Помогал мне в этом сейвфром, который умеет скачивать плейлисты из ютуба (умел по крайней мере пол года назад). Алгоритм такой — проклацивал кнопку «добавить в посмотреть позже» на подписках, потом весь плейлист скачивал, а потом удалял видео из плейлиста. Через месяц повторял. Но однажды ютуб поменял интерфейс и удаление перестало быть удобным — нужно нажать на выпадающее меню, и там уже «удалить из плейлиста». Что ломало мой алгоритм. И снова АНК. Скрипт на четыре кнопки — 1 и 2 запоминают позиции мыши (на выпадающем меню и на пункте «удалить»), третья запускает перемещение и клики мыши, четвертая останавливает скрипт. Итог — вручную делать уже не надо.
— в онлайн игре играл в 9 окон (ходил на рейд в соло в л2, управляя всем из одного) — это не продвинутый бот и пришлось помучаться но в итогесмог отправлять команды в свёрнутые окна не открывая из, было удобно; в другой игре был тупой крафт, где тоже нужно было прокликивать одни и те же места, тоже скрипт сработал.
— часто работаю в премьер про (программа видеомонтажа) и там некоторые удобные функции не реализованны, увы. Но они прекрасно допиливаются скриптом. Те же накидывания эффектов. Приходится переключаться на отдельную панель, имкать там эффект и перетаскивать на слой.Но те кто работал в АЕ с Fx console меня поймет, это можно сделать удобнее — скрипт сам делает все эти действия, еще и за секунду. Или еще пример. Часто приходится повышать уровень громкости, и это однотипное движение, особенно если видеофрагментов под сотню. Все вместе тоже нельзя — автоматика выровняет по самому громкому кусочку, что попортит все. Выручает скрипт. И еще полезность — горячие клавиши нельзя повесить на правую кнопку мыши, но иногда хочется — опять скрипт. Сделал перемещение курсора себе на пкм. Он еще и щупает что лежит под курсором и если там кусочек видео, то выпадает меню (как обычно), а если пустота то срабатывает горячая клавиша.
— надо было отстабилизировать много фрагметов видео. Алгоритм следющий — выделяем фрагмент, набрасываем на него стабилизатор, жмем «анализ», ждём пока пройдет анализ (каждый раз разное время, зависит от длинны кусочка видео), и переходим к следующему кусочку. И так пару сотен кусков. С коллегой решили что лучше потратить время на настройку скрипта и оставить компьютер на ночь чем сидеть руками делать. И помогло что скриптом можно определять открыто ли окно анализа, на что мы и ориентировались.
Если вы подумали, что для того чтобы сделать всё тут описанное нужны навыки програмирования, то вы ошибаетесь. Большая часть примеров была сделана путем копирования скрипров которые записаны в русской документации по программе (прямо напрячься пришлоь только в скрипте для игры). Да и на самом деле сейчас есть много других программ, в которых даже не нужно ничего писать текстом, записывай действия и все (как в оригинальном посте).
Поэтому помните, что автоматизация это бро. Иногда стоит потратить время на обдумывание однообразной задачи и попытки её автоматизировать.
Как определить координаты мыши при помощи JavaScript
Довольно часто JavaScript-программистам, необходимо знать координаты курсора мыши относительно окна браузера.
Решение очень простое на самом деле, ниже показан пример и сам исходный код решения.
Двигай курсором или нажимай левой кнопкой мыши по экрану и наблюдай как меняются координаты.
<script type= "text/javascript" >
/**
* Объект работает с координатами курсора
*
* @author Artem Fedorov 2010
*
*/
var MouseCoords = <
// X-координата
getX: function (e)
<
if (e.pageX)
<
return e.pageX;
>
else if (e.clientX)
<
return e.clientX+( document .documentElement.scrollLeft || document .body.scrollLeft) — document .documentElement.clientLeft;
>
// Y-координата
getY: function (e)
<
if (e.pageY)
<
return e.pageY;
>
else if (e.clientY)
<
return e.clientY+( document .documentElement.scrollTop || document .body.scrollTop) — document .documentElement.clientTop;
>
document .onmousemove = function (e)
<
if (!e) e = window .event;
var mouseCoordsLayer = document .getElementById( ‘mouse_coords_on_move’ );
mouseCoordsLayer.innerHTML = ‘<h2>Координаты во время движения</h2>’ ;
mouseCoordsLayer.innerHTML += ‘<p>X: ‘ +MouseCoords.getX(e)+ ‘</p>’ ;
mouseCoordsLayer.innerHTML += ‘<p>Y: ‘ +MouseCoords.getY(e)+ ‘</p>’ ;
>
document .onclick = function (e)
<
if (!e) e = window .event;
var mouseCoordsLayer = document .getElementById( ‘mouse_coords_on_click’ );
mouseCoordsLayer.innerHTML = ‘<h2>Координаты при клике</h2>’ ;
mouseCoordsLayer.innerHTML += ‘<p>X: ‘ +MouseCoords.getX(e)+ ‘</p>’ ;
mouseCoordsLayer.innerHTML += ‘<p>Y: ‘ +MouseCoords.getY(e)+ ‘</p>’ ;
>
<div style=»color:#0000FF»>"mouse_coords_on_move" > </div>
<div style=»color:#0000FF»>"mouse_coords_on_click" > </div>
Разъяснение
Объект MouseCoords имеет 2 метода MouseCoords.getX(e) и MouseCoords.getY(e) , которые принимают параметр e (event) , самое главное этот параметр получить, после какого-либо события (движение мыши, клик по области экрана и т.д.)
Затем на примере описываются 2 события:
- document.onmousemove — движение курсором мыши по экрану;
- document.onclick — клик левой кнопкой мыши по любому месту на экране.
В этих событиях создается event и передается в качестве параметра методам объекта MouseCoords .
Получение координат курсора мыши на JS

На этом уроке мы научимся выводить на странице значения координат (X, Y) курсора, в момент движения мыши внутри блока с помощью JavaScript. Определение координат курсора мыши прямо на лету, активно используется в программировании игр, при масштабировании элемента внутри заданной области и много где еще.
Посмотрите демо на CodePen
HTML разметка
Создадим один блок с классом block, внутри которого будем двигать мышью. Во втором блоке с классом coords, будут выводится значения текущих координат курсора.
CSS код
Обоим блокам зададим class оформление для презентабельного вида.
.block <
width: 200px; /* ширина */
height: 150px; /* высота */
border: 10px solid plum; /* толщина и цвет сплошной рамки */
margin: 40px auto; /* отступ сверху и горизонтальное выравнивание по центру */
text-align: center; /* текст в центре по горизонтали */
line-height: 150px; /* текст в центре по вертикали */
font-size: 20px; /* размер шрифта */
font-family: sans-serif; /* семейство шрифтов */
>
.coords <
width: 180px; /* ширина */
border: 10px solid plum; /* толщина и цвет сплошной рамки */
margin: 10px auto; /* отступ сверху и горизонтальное выравнивание по центру */
padding: 10px; /* поля вокруг, чтобы текст не прилипал к рамке */
font-size: 30px; /* размер шрифта */
font-weight: 700; /* жирность шрифта */
font-family: 'Arial Narrow Bold', sans-serif; /* семейство шрифтов */
>
JavaScript код
Чтобы отловить координаты, нужно на первый блок повесить событие перемещения мыши onmousemove. Для этого из документа получим сам блок по его селектору (.block)
Затем напишем анонимную функцию и в скобках передадим ей объект события event. Анонимная функция — это функция без имени, которая которая применяется только один раз.
Как работает механизм отслеживания координат? Выведем в консоль браузера объект события event, наведем мышку внутри блока и сразу сработает событие MouseEvent. console.log(event); // вывод в консоль
Среди внушительного списка разных свойств, вы увидите значения координат. Нас интересуют координаты offsetX и offsetY, которые показывают координаты мыши относительно блока.

Координаты мыши внутри объекта определяются свойством события offset. Указываем место во втором блоке, где будут выводится значения координат из объекта события event. Получаем из документа span с классом x и вписываем в HTML страницу, координату offsetX. Точно так же поступаем и с координатой .
document.querySelector('.x').innerHTML = event.offsetX;
document.querySelector('.y').innerHTML = event.offsetY;
JavaScript код целиком:
document.querySelector('.block').onmousemove = function(event) <
event = event || window.event; // кроссбраузерность
console.log(event); // вывод в консоль
document.querySelector('.x').innerHTML = event.offsetX;
document.querySelector('.y').innerHTML = event.offsetY;
>
Получение координат курсора относится к базовой основе языка JavaScript. Если вам было интересно и вы хотели бы продолжить дальше знакомство с JS, то приглашаю вас на мой видеокурс. Гарантирую, что скучно вам точно не будет, ведь курс содержит массу практических примерова и упражнений.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Как узнать позицию курсора мыши относительно экрана?
Как узнать позицию курсора по координатам (X, Y) относительно экрана, не прибегая к средствам Windows.Forms ?
![]()
В WPF есть класс Mouse у которого есть метод GetPosition. Чтобы получить позицию курсора относительно экрана можно использовать метод PointToScreen
Или как еще один вариант — использовать PInvoke.
![]()
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.