Войти
Войти
 

Регистрация

Уже есть аккаунт?
Полная версия Пикабу

Автоматизация рутины с AutoHotKey

в

Здравствуйте! Сегодня я хочу познакомить вас с замечательным инструментом автоматизации под названием AutoHotKey!

С ним вы сможете:

1) Программировать действия мышкой, нажатия клавиш;

2) Быстро заполнять однотипные бланки, формы;

3) Ставить на горячие клавиши заклинания, кастовать их в течение миллисекунд после перезарядки (что бывает критично);

4) Автоматизировать какие-либо рутинные действия и идти пить кофе.


Сразу предупрежу - писать скрипты поначалу очень капризное занятие. Будут такие ситуации, что код почему-то не работает, и вам придется думать полдня где вы совершили ошибку. Листать документацию. Просить помощи в интернете. Проверять синтаксис.

Однако вложенное время окупается с лихвой. При достаточном освоении AutoHotKey сэкономит вам кучу времени и нервов.


В данном посте я дам лишь описание конкретных примеров применения скриптинга на практике и расскажу про те подводные камни, которые не описаны в документации.


Итак, начнем. Ссылка на программу:

https://autohotkey.com/download/ahk-install.exe (3 Мб)


Написание кода ведется в файлах *.ahk, которые редактируются обычным блокнотом.

Создайте текстовый файл и измените его расширение.

Автоматизация рутины с AutoHotKey AutoHotKey, Автоматизация, Программирование, Офисные будни, Образование, Длиннопост

Затем откройте его с помощью блокнота. Теперь вы готовы к работе!

Перейдем к практике.

Напишите


F1:: Send Здравствуйте{!}


Сохраните изменения. Запустите скрипт двойным кликом. Встаньте на какое-нибудь текстовое поле и нажмите F1. Первый опыт скриптинга у вас уже есть.

!, #, ^, +  это служебные знаки. Для того, чтобы напечатать их, нужно оформить их скобками.

Для выключения скрипта нажмите на его иконке возле часов, затем Exit.


Краткое введение закончено, дальше пойдут лишь небольшие советы.


1) Добавьте к скрипту

F12:: Suspend, Toggle

, чтобы ставить/снимать его с паузы клавишей F12


2) Чтобы горячая клавиша не блокировалась скриптом и выполняла также свою обычную функцию, пишите ~.

~F3:: Send {Down}


3)

1::

Send {Tab 5}привет{Enter}  ;пять раз таб, привет, энтер

Click 100, 100  ;клик по заданным координатам, отсчитывается слева-сверху

Click, 2  ;клик два раза

Click right  ;клик правой кнопкой

Send {Down}{Left}{Up}

Send {PgUp}{PgDn}

Send {Space}{Del}

Send {b down}

Sleep, 1000  ;зажать b, ждать 1 секунду, отпустить

Send {b up}  

Return  ;конец списка команд, вызываемых кнопкой "1"


Полный список клавиш смотрите в документации. Пуск -> AutoHotKey -> AutoHotKey HelpFile -> Mouse and Keyboard -> Send


4)

^F1::  ;при нажатии на Ctrl+F1

MouseGetPos, X, Y  ;выдаст текущие координаты курсора

MsgBox, %X%, %Y%

Clipboard = %X%, %Y%  ;и скопирует их в буфер обмена

Return


Обратите внимание - по умолчанию координаты отсчитываются от левого верхнего угла активного окна.

Можно заставить скрипт отсчитывать координаты от левого верхнего угла экрана, предварительно прописав:


CoordMode, Mouse, Screen


Вернуться обратно:


CoordMode, Mouse, Window


5) Модификаторы: "^" = Ctrl, "+" = Shift, "!" = Alt.

Send !{Tab}  ;Alt+Tab

Send +{Home}

Send ^{vk56}  ;Ctrl+V


Почему именно {vk56}, а не {v}? Потому что ^{v} будет работать только при английской раскладке, при русской пришлось бы написать ^{м}.

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


Список наиболее часто используемых виртуальных кодов:


Send ^{vk43} ;Ctrl+C

Send ^{vk56} ;ctrl+V

Send ^{vk58} ;ctrl+X

Send ^{vk41} ;ctrl+A

Send ^{vk5A} ;ctrl+Z

Send ^{vk53} ;ctrl+S

Send ^{vk51} ;ctrl+Q

Send ^{vk57} ;ctrl+W

Send ^{vk52} ;ctrl+R

Send ^{vk42} ;ctrl+B

Send ^{vk4E} ;ctrl+N

Send ^{vk4C} ;ctrl+L


Аналогично, если вы хотите сделать буквенную клавишу горячей, лучше обратиться к ней через ее виртуальный код:


vk56::Send {Click}  ;посылает клик при нажатии на "м" или "v".


Полный список виртуальных кодов клавиш: http://www.kbdedit.com/manual/low_level_vk_list.html


6) Быстро разворачиваем фотографии правильной стороной.

В стандартной утилите просмотра фотографий Windows есть опция "Развернуть картинку"

Автоматизация рутины с AutoHotKey AutoHotKey, Автоматизация, Программирование, Офисные будни, Образование, Длиннопост

NumPad1:: Send ^{,}

NumPad2:: Send ^{.}


Обратите внимание, что эти клавиши работают только при английской раскладке.

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

И еще: чтобы нажать Numpad1 и 2, должна гореть лампочка NumLock.


7)

~1::

Loop,

{

If A_Cursor=Unknown

Click

Sleep, 20

If GetKeyState("2","p")=1

Break

}

F12::Suspend, Toggle


При нажатии кнопку 1 скрипт будет посылать клики, если заметит, что курсор принял форму руки. Нажатие кнопки 2 (и непродолжительное ее удерживание) разрывает цикл.

Осторожно, если вы наведете мышь на ссылки браузера при активном цикле, он вам их откроет!


Таким образом я автоматизировал прохождение флеш игры Deanimator.

Достаточно навести мышкой на зомби, и профессор сам стреляет, да еще и со скоростью пулемета!

http://www.de-animator.com/deanimator.swf

Автоматизация рутины с AutoHotKey AutoHotKey, Автоматизация, Программирование, Офисные будни, Образование, Длиннопост

8)

1::

MouseGetPos, xpos, ypos

MouseClick, left, 130, 70, , 0 ; [WhichButton , X, Y, ClickCount, Speed, D|U, R]

MouseMove, xpos, ypos, 0

Return


Скрипт кликает карточку горохострела вверху экрана и вовзвращает курсор на место.

Цифры 0 в обоих операторах отвечают за скорость перемещения курсора, то есть мгновенно.

Можно закрепить за клавишей 1 горохострел, за 2 - подсолнух и т.д., и быстро без напряга сажать растения.

(координаты 130, 70 вам, скорее всего, придется поменять. Воспользуйтесь пунктом 4)

Автоматизация рутины с AutoHotKey AutoHotKey, Автоматизация, Программирование, Офисные будни, Образование, Длиннопост

9) Допустим, вам нужно поставить звездочку или другой символ в конце каждой строки.

Автоматизация рутины с AutoHotKey AutoHotKey, Автоматизация, Программирование, Офисные будни, Образование, Длиннопост

NumPad1::

Send {*}{Up}{End}

Return


Ставим звездочку, переходим вверх, идем в конец строки. Готово!

Если нужно удалить символ в конце каждой строки, пишем:


NumPad1::

Send {Backspace}{Up}{End}

Return


Если нужно удалить два символа:


NumPad1::

Send {Backspace 2}{Up}{End}

Return


10) Нужно щелкать мышью как можно чаще? Не проблема!

Автоматизация рутины с AutoHotKey AutoHotKey, Автоматизация, Программирование, Офисные будни, Образование, Длиннопост

~1::

While GetKeyState("1","p")=1

{

Click

Sleep 20

}

Return


Данный скрипт посылает клики каждые 20 мс при нажатой клавише "1".

Или можно так. Посылаем клики до тех пор, пока не будет нажата клавиша "2".


1::

While GetKeyState("2","p")=0

{

Click

Sleep 20

}

Return



Ладно, на этом пока все. Будут вопросы - обращайтесь!

Можно даже сделать так: пишите какие типичные рутинные операции нужно разобрать, и они появятся в следующем посте!


P.S.

/*

Многострочный комментарий.

Для выключения участков кода

*/

  •  
  • 1249
  •  
1304 плюса 55 минусов

354 комментария

+16
 

не советую как в посте использовать обычный Send так как если случайно напишите что то типо:

w:: send w

у вас код уйдет в цикл и крашнется винда, так что рекомендую использовать SendInput

+4
 

$w::send w

не вызовет цикла

0
 

vk57:: ; "W" например. или Ц, без разници

0
 

Menu, Tray, Icon, C:\Windows\system32\shell32.dll, 18

;DetectHiddenWindows, On ;посылает сообщени§ скрытым окнам

;SendMode Input

; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ===============

ConnectName = Odeon2

Login = vlad2

Pass = vlad2

AdapterNum = 2 ; с какого адаптера получать IP (обычно со 2-го)

SleepTime = 1000 ; пауза между коннектами (при неудачной попытке)

; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ==========

/*

IP_Before := A_IPAddress%AdapterNum%

If IP_Before != 0.0.0.0 ; коннект уже есть

{

ExitApp ; конец скрипта

}

*/

Connect:

RunWait, rasdial "%ConnectName%" "%Login%" "%Pass%",, Hide ; коннектимся

IP_After := A_IPAddress%AdapterNum%

If IP_After = 0.0.0.0 ; нет коннекта

{

Sleep, %SleepTime%

Goto, Connect

}

; ========== ===============

Run, E:\Ярлык\Ярлыки\Службы\Odeon.rdp

Up::

ScreenPath:="C:\Users\Home\Desktop\"

FormatTime, FileName, , dd.MM.yy+HH.mm.ss

saveFileTo := ScreenPath . fileName . ".png"

Run, nircmd.exe savescreenshot "C:\Users\Home\Desktop\%fileName%.png" 9 60 293 656

SoundPlay, E:\Portable\LightscreenPortable\App\Lightscreen\sounds\ls.screenshot.wav, wait

WinWaitClose, Odeon — 192.168.6.232 — Подключение к удаленному рабочему столу

Run, rasd

DrRoy 
+46
 

Уважаемый ТС. Я очень ценю ваше стремление к познанию нового ПО, но есть одно но. Работа со скриптами может увлечь далеко не каждого пользователя. Есть гораздо более дружественная программа с более расширенным функционалом. Называется xStarter.

+57
 

Чем лучше?

Я тут за autoit если что)))

lemniscat 
+19
 

Плюсую с autoit можно даже напрямую с directx работать

Раскрыть ветвь27  
+6
 
Синтаксис данной приблуды очень похож на AutoIT. Уж не знаю, кто с кого списывал. В любом случае, как человек, который автоматизировал работу отдела из сотни сотрудников и кучу сценариев, которые сутками обрабатывались (само собой, падая на голову за день до сдачи) рекомендую и вам, и @netwizard, забить на скриптовые поделки и взять нормальные инструменты, если у вас нет проблем с компиляцией. Я переписал тот же AutoIT на C#, получив удобную (в те времена) библиотеку, которая даже с банальными операциями вроде поиска окна и отправки команд отдельным элементам (ComboBox, ListBox) работала в несколько раз быстрее и надежнее, тогда, как AutoIT могла просто зауиснуть на 762 документе из 30000 в 3 часа ночи. Сейчас же все более распространение получают WPF и UWP, у которых может не быть WinAPI подложки. Такими элементами вы будете управлять только клавиатурой и мышью. Сейчас же существует куча готовых библиотек для автоматизации UI, которые с этим справляются. Опять же, нормальный язык программирования позволит вам раюотать и напрямую с объектами окруэения. Та же операция доюавления звездочки в конце строки решается автозаменой \r\n на *\r\n (впрочем, с этим справится и нормальный текстовый редактор, вроде Notepad++). AutoIT - хороший способ войти в мир автоматизации, не нцжно искать библиотеки, не нужно ставить Visual Studio или, прости хоспади, IntelliJ. Но задерживаться на нем я настоятельно не рекомендую.
Раскрыть ветвь2  
+1
 
Согласен, autoit. И как вариант hardcor - lua script
Раскрыть ветвь4  
0
 

а можно клик по области хоткею присвоить?

Раскрыть ветвь1  
+3
 

Может кому-то пригодится: JitBit MacroRecorder

Отличная простенькая программа.

+2
 
А еще можно взять клаву\мышь сразу с макросами и настроить через графический интерфейс. Скучнее, затратнее, но быстрее и проще точно.
0
 

Мышь с макросами умеет организовывать циклы? Не сарказм, реально интересно.

Раскрыть ветвь3  
iMaks533 
+1
 

Ничего лучше и проще Clickermann нет и не будет.

basvas4 
+1
 

Кстати для совсем чайников есть такая штука Automatic Mouse and Keyboard

0
 

подскажите пожалуйста

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

0
 

Как понять по области? Можно кликнуть по точке внутри некой области


SendMode Input

1::

Click A, B

Return


где A B координаты точки

Раскрыть ветвь2  
0
 

с AHK можно познакомится в более игровой среде например в SAMP( San Andersan Multi Player), там это более интереснее применяется

1990Newbie 
0
 

А кто подскажет название подобной же программы автоматизации, куда прямо в код можно вставлять куски изображений и она будет их искать на экране ? (т.е. дополнительных функций по распознаванию писать не нужно)

scogra 
+5
 

Хочешь прохождение Алаваровских игр с поиском предметов автоматизировать?

+1
 

Кибор, там есть полное визуальное программирование. То есть просто создавать можно рисованными блоками логику. и он в скрипт преобразует.
http://kibor-bot.com/stat/visual-programming.php

+1
 

Sikuli

Раскрыть ветвь12  
+9
 

В нормальном блокноте можно удалить звездочку (иди добавить) заменой: конец строки обозначается как "\n", что бы убрать звездочку в конце нужно заменить "*\n" на "\n" (без кавычек), если добавить, то "\n" заменить на "*\n".

MdbM 
+9
 

uopilot

kasyanov 
+5
 

А вы старый ультимист!

MdbM 
+3
 
Однако спасибо) Не ожидал такого коммента)
Slemssnk 
+1
 

она еще прекрасно подходит для RFOnline, и скорей всего других игр

HEKPOH 
+3
 

+1. Со времен Ультимы при каче в 8 окон, использую везде. Вот где интуитивный функционал )

MdbM 
+1
 

О времена)))

А сейчас пилот подгоняется под, наверное, любую игру. Я с пилотом в ArchAge играл)))

+5
 

Про звездочки.

Для работы с текстом есть очень крутой Sublime Text

Вот, например:

yaboroda 
+2
 
Не подскажете, как такое сделать? Сам пользуюсь саблаймом, но несколько курсоров ставлю только кликами с нажатым контролом.
+2
 
Выделить несколько строк -> Ctrl + Shift + L
treegross 
+9
 

Как показывает практика для 99% простых пользователей использование уже стандартных сочетаний клавиш уже чудо дивное, а использование более продвинутой системы для них - это что-то на уровне установок термоядерного синтеза.

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

0
 

Просто они не понимают преимуществ автоматизации.

C3p10 
+10
 

В своё время таким образом автоматизировал некоторые моменты в ММО игре, да и не я один таким занимался среди игроков, если интересно могу скинуть видео которое осталось, по сути игра была запущина в 3 окна или больше\меньше и персонажи сами в трёх окнах занимались тем что было прописано в макросе.

+10
 

скидывай, интересно

MrSnippy 
+3
 

Так и не скинул. :-/

Rodomir 
+2
 

я все еще не теряю надежды

YourSavior 
0
 

В Lineage2 таким образом можно было нехило так ботоводить.

"Сложно, но можно".

Правда это было лет 10 назад...

VikManz 
+1
 

Отлично работает схема в 9 окон. Одно основное, остальные 8 свернуты. И прекрасно в свернутые окна команды отправлялись.

AlexNSK 
0
 
Скидывай
cwl.net 
+3
 

Внесу свои 5 копеек. Работа связана с наукой-инженерией и очень удобно использовать привычные обозначения - альфы, беты, подстрочные и надстрочные индексы, поэтому по мере необходимости наполняю скрипт примерно следующего содержания:


!b::

Send β

return


!d::

Send δ

return


!e::

Send ε

return


Здесь !a, !b и тд - Alt + a, Alt + b и тд. Эти комбинации перехватываются и попросту вставляется вставленный в скрит unicode-символ.



Также очень удобно вставлять нижние индексы в ответ на сочетание "_0", "_1" и тд:

:*?:_0::₀

return


:*?:_1::₁

return

alexandr8153 
0
 

Поясни, пожалуйста, что значит :*?: и ::₁, и на какую клавишу бинд. Буду очень благодарен.

cwl.net 
+1
 

Как ты этот пост нашёл-то ... 0_o


Подробно описано, как это работает, здесь https://autohotkey.com/docs/Hotstrings.htm

Поясни, пожалуйста, что значит :*?: и ::₁, и на какую клавишу бинд
Бинд не на клавишу, это бинд автозамены строки (двух символов) "_1" на символ "".Итак:


:*?:_1::₁
* между первыми двумя двоеточиями означает - что автозамена срабатывает без какого-ибо последующего trigger-символа, т.е. как только нажата "1" после "_";
? между первыми двумя двоеточиями означает - что автозамена срабатывает даже внутри слова;

Простейший вариант автозамены выглядит как
::btw::by the way
вместо "btw" он вставит "by the way", здесь, как видно, нет модификаторов * и ? между первыми двумя двоеточиями.

Раскрыть ветвь5  
Еще 254 комментариев