Подробнее о скриптах HotkeyNet
Этот материал продолжает тему скриптов HotkeyNet. Здесь рассмотрены более сложные функции: циклические переключатели, условные операторы, подпрограммы и шаблоны. С их помощью можно изменить поведение персонажей, вплоть до полного автоматизма. Несмотря на такие "страшные" слова, в статье не трудно разобраться даже новичку.
Перед продолжением обязательно изучите первую статью по этой теме.
Циклические переключатели
Переключатели позволяют горячей клавише выполнять разные действия при каждом вызове. Их можно использовать для создания в игре таких клавиш, которые будут выполнять сначала одни действия, а при следующем нажатии другие. Или одно и то же действие может быть выполнено сначала в первом окне, затем во втором и т. д.
Например, следующая горячая клавиша при первом нажатии передаст в окно с меткой "w1" X, во второй раз Y, и в третий Z. На четвёртом нажатии все начнётся с начала.
<Hotkey F1>
<Toggle>
<SendLabel w1>
<Key X>
<Toggle>
<SendLabel w1>
<Key Y>
<Toggle>
<SendLabel w1>
<Key Z>
Такой переключатель может иметь сколько угодно позиций. В исходное состояние он сбрасывается при помощи ResetToggles. А с помощью команды SetToggle можно выбирать, какой Toggle-блок будет выполнен следующим.
Переключатели могут быть использованы только в горячих клавишах, но не в пользовательских командах. Если вам нужно использовать такое переключение в пользовательской команде, создайте горячую клавишу с переключателем и вызывайте её командой DoHotkey как подпрограмму.
Более подробную информацию смотрите в описании команды Toggle.
Условные операторы
Иногда вам может понадобиться, чтобы горячая клавиша срабатывала только во время работы с каким-то определённым окном. Например, эта горячая клавиша печатает "Hello", но только когда на переднем плане находится окно под названием "WoW1":
<Hotkey F1>
<If ActiveWinIs WoW1>
<SendLabel w1>
<Text Hello>
Предыдущий пример немного примитивен, поскольку триггер F1 не сработает, если активно окно с другим названием. Чтобы горячая клавиша реагировала в остальных окнах так, будто она вовсе не назначена, добавьте блок Else:
<Hotkey F1>
<If ActiveWinIs WoW1>
<SendLabel w1>
<Text Hello>
<Else>
<SendFocusWin>
<Key %Trigger%>
Условий может быть несколько. Допустим, мы хотим добавить еще несколько строк, чтобы горячая клавиша печатала "Bye", если активно окно с заголовком "WoW2":
<Hotkey F1>
<If ActiveWinIs WoW1>
<SendLabel w1>
<Text Hello>
<Else If ActiveWinIs WoW2>
<SendLabel w1>
<Text Bye>
<Else>
<SendFocusWin>
<Key %Trigger%>
В этих примерах использовалось условие "ActiveWinIs", чтобы проверить, какое окно активно на момент вызова триггера. Но существуют и другие условия, которые можно проверять. Для просмотра полного списка нажмите здесь.
Технические замечания:
- Условие проверяется только на локальном компьютере (на котором вы нажимаете клавишу).
- If-блоки всегда вкладываются внутрь Toggle-блоков (если применён циклический переключатель). Вы можете увидеть как HotkeyNet интерпретирует вложенность в назначенных вами клавишах, нажав "Show loaded hotkeys" в правом нижнем углу программы.
- В текущей версии HotkeyNet нельзя вложить один If-блок внутрь другого If-блока.
- Дописывать в конце оператор EndIf необязательно до тех пор, пока вам не понадобится добавить дополнительные действия, которые должны всегда выполняться.
- Операторы If, Else и EndIf могут быть использованы только в горячих клавишах, но не в пользовательских командах. Если это потребовалось, используйте вместо пользовательской команды горячую клавишу и вызывайте её при помощи DoHotkey как подпрограмму.
Структурирование кода
Если вы сталкивались с программированием, вам, должно быть, привычно делить код на секции специальными символами. Скрипты HotkeyNet не такие. Они содержат блоки, но нет ни одного способа отмечать их границы. Вместо этого HotkeyNet применяет правила, чтобы определить, где кончается один блок и начинается следующий.
Допустим, ваш скрипт содержит такой код:
<Hotkey F1>
<Toggle>
<If ActiveWinIs WoW1>
<Key A>
<Else>
<Key B>
<Toggle>
<If ActiveWinIs WoW2>
<Key C>
<Else>
<Key D>
HotkeyNet во время загрузки кода делит его на блоки, как это видно по отступам на следующей иллюстрации:
Изображение демонстрирует одну из самых удобных возможностей программы. Это окно открывается через меню "Actions > Show hotkey definition". Если вызвать назначенную ранее горячую клавишу, в данном окне отобразится, как HotkeyNet интерпретирует код, который вы написали. Часто результат отличается от введённых вами данных.
Обратите внимание, HotkeyNet добавил блоки SendPC, указывающие на локальный компьютер по умолчанию.
Как HotkeyNet решает, какой блок вложить внутрь другого блока? Программа следует двум правилам. Во-первых, блоки отделяются друг от друга в следующем порядке:
- Горячие клавиши
- Toggle-блоки
- If-блоки и Else-блоки
- SendPC-блоки
Изменить этот порядок невозможно - он встроен в программу.
Во-вторых, блок "закрывается", когда в скрипте встречается другой блок такого же или более старшего уровня. Например, "тело" горячей клавиши заканчивается там, где начинается следующая. А Toggle-блок заканчивается, когда начинается следующий Toogle-блок или следующая горячая клавиша.
Второе правило означает, что нельзя какой-либо блок вложить внутрь другого блока такого же типа. В частности, невозможно вложить If-блок внутрь другого If-блока. Обойти это ограничение можно, если поместить участок между "If" и "Else" в отдельную горячую клавишу, и вызвать на его месте новую клавишу с помощью DoHotkey.
HotkeyNet почти всегда понимает, где заканчивается тот или иной блок, исключая всякую неопределенность. Но иногда вам может понадобится после If-блока добавить действия, которые должны всегда выполняться без каких-либо условий. В таком случае необходимо перед этими действиями дописать <EndIf> - так HotkeyNet узнает, что они не являются частью If-блока.
Все команды, представляющие собой действия, переносятся на последний уровень - внутрь SendPC-блоков. Если вы попытаетесь добавить действие за пределами SendPC-блока, HotkeyNet решит, что вы хотели его поместить внутрь стандартного SendPC-блока, отправляющего нажатия на локальный компьютер.
Пользовательские команды
HotkeyNet позволяет создавать команды, которые являются мощным и более продвинутым инструментом, чем горячие клавиши. Вот как это работает.
Допустим, вы играете в игру, в которой ваши персонажи произносят "Port Transylvania", чтобы попасть в Трансильванию. И, предположим, им приходится бывать не только в Трансильвании, но и в десятках других мест. Вы можете облегчить путешествия, наделав десятки горячих клавиш - по одной на каждое направление. Но тогда нам придётся писать много лишнего кода, и будет трудно запомнить, за какое направление отвечает каждая клавиша.
Пользовательские команды предлагают другое решение этой задачи - вызвав горячую клавишу, мы увидим небольшое окно с текстовым полем:
Вводим требуемое направление:
После нажатия на Enter все персонажи произнесут "port transylvania". Этот способ лучше уже потому, что можно указать любое направление, какое вам захочется. Например, вы можете написать так:
И ваши персонажи вместо этого отправятся в Альбион.
Чтобы окно с командной строкой работало таким образом, в скрипте нужно сделать следующее:
- Определить, что будет делать команда "port".
- Назначить горячую клавишу, которая вызовет окно со словом "port".
Первый шаг выглядит так (чтобы код был короче и понятнее, в примере указано только одно окно с игрой):
<Command port>
<SendPC local>
<SendWin MyGame1>
<Text /say port %All%>
<Key Enter>
Выделенный красным цветом фрагмент называется макрокомандой. Запустив команду "port", HotkeyNet заменит макрокоманду тем, что вы введете после слова "port" в командной строке. Если вы хотите подменить в команде не фразу целиком, а отдельные слова в разных её частях, используйте %1%, %2%, %3% и т. д. вместо %All%.
Вторым этапом, необходимым для правильной работы пользовательской команды, является назначение клавиши, которая отобразит окно с командной строкой. В этом примере мы откроем окно с уже набранным словом "port", хотя это необязательно. Вот как это выглядит:
<Hotkey Ctrl P>
<SendPC local>
<CommandLine port>
Вот и всё, что нам потребовалось сделать. Это заняло всего восемь строк кода. Его легко читать и удобно править, чего нельзя сказать о добавлении множества однотипных горячих клавиш.
У передаваемого в игру текста есть ограничения. Подробнее читайте об этом в описании команды Text.
Командная строка в сторонних приложениях
В предыдущем примере использовалось окно с командной строкой, поскольку так проще понять суть. Но вы можете использовать команды и без такого окна. При желании можно вводить назначенные вами команды в игровой чат или в любое текстовое поле любой программы. Подробности смотрите в описании ThirdPartyCommandLine.
Подпрограммы
Пользовательские команды также можно использовать в виде подпрограмм, применяя их внутри других команд или горячих клавиш.
Представим ситуацию, в которой горячая клавиша посылает нажатие в окно, ждёт 500 мс, и посылает нажатие снова. Выглядит это так:
<Hotkey F1>
<SendPC local>
<SendWinM WoW1>
<Key 5>
<Wait 500>
<Key 7>
Это был довольно простой пример и он прекрасно работает. Но что делать, если нужно совершать действия в пяти разных окнах? Описание действий может сильно растянуться. Подпрограмма поможет сократить повторяющийся код. Для этого создадим пользовательскую команду:
<Command SendTwoKeys>
<SendPC %1%>
<SendWinM %2%>
<Key %3%>
<Wait 500>
<Key %4%>
И назначим горячую клавишу следующим образом:
<Hotkey F1>
<SendTwoKeys local WoW1 5 7>
<SendTwoKeys local WoW2 5 7>
<SendTwoKeys local WoW3 5 7>
<SendTwoKeys local WoW4 5 7>
<SendTwoKeys local WoW5 5 7>
Выполнение подпрограмм на удалённом компьютере
В предыдущем примере все окна располагались на локальном компьютере, на котором и была вызвана горячая клавиша. Но что, если одно из окон запущено на удалённом компьютере из нашей локальной сети? В таком случае эффективнее будет загрузить подпрограмму на удалённый компьютер и вызывать её с локального. Для этого удалим "SendPC" из команды (этот блок будет перемещён в горячую клавишу), после чего сохраним изменённую команду в скрипте каждого компьютера:
<Command SendTwoKeys> // Новая версия
<SendWinM %1%> // Загрузите её на каждый компьютер
<Key %2%>
<Wait 500>
<Key %3%>
Горячая клавиша теперь будет выглядеть так:
<Hotkey F1>
<SendPC Local>
<SendTwoKeys WoW1 5 7>
<SendTwoKeys WoW2 5 7>
<SendPC 192.168.1.102>
<SendTwoKeys WoW1 5 7>
<SendTwoKeys WoW2 5 7>
Технические замечания
Есть возможность воспользоваться горячей клавишей также как подпрограммой. Для этого вызовите её с помощью DoHotkey. Иногда это может пригодиться, потому что некоторые ключевые слова и конструкции нельзя применять в командах, но можно в горячих клавишах (например, условные операторы или циклические переключатели).
Шаблоны
Шаблонами называются фрагменты текста, которые подставляются в скрипт. HotkeyNet создает копии выбранного фрагмента с макроподстановкой, поэтому каждая копия может отличаться друг от друга. Рассмотрим на примере.
Предположим, вам необходимо создать две горячие клавиши, которые имеют небольшие отличия, выделенные красным:
<Hotkey F1>
<ToggleWin X Y>
<Hotkey F2>
<ToggleWin W Z>
Вместо двукратного описания действий удобнее создать шаблон:
<Template MyTemplate>
<Hotkey %1%>
<ToggleWin %2% %3%>
<EndTemplate>
Теперь каждая горячая клавиша занимает по одной строке:
<ApplyTemplate MyTemplate F1 X Y>
<ApplyTemplate MyTemplate F2 W Z>
Чтобы увидеть результат копирования, нажмите "Show loaded hotkeys" в главном окне HotkeyNet.
Использование дешёвых клавиатур вместо X-Keys
X-keys - это специальные программируемые клавиатуры. Их стоимость составляет порядка 120 $. Благодаря HotkeyNet можно купить клавиатуру за 15 $ и выполнять с ее помощью те же самые действия.
Есть только одно но - вам нужно иметь не меньше двух компьютеров. После подключения простой клавиатуры ко второму компьютеру, загрузите в него скрипт с описаниями действий для клавиш этой клавиатуры. Вызовы клавиш с запрограммированной клавиатуры будут передавать на главный компьютер не обычные нажатия, а действия, описанные в скрипте.
Такой подход работает потому, что с HotkeyNet каждый компьютер может передавать команды всем остальным, независимо от того, является ли он сервером или клиентом.
Evgeniy
Спасибо за статьи по hotkeynet, спустя много лет опять перечитываю их.
Уже 2ой день допиливаю под себя скрипт для мультибоксинга в вове. Осталось доделать работу с передачей кликов мышки, понять, на сколько работоспособность мышки можно приблизить к работе в Isboxer. Хочется играя от лица танка хилить всю группу через аддон healbot(либо можно grid+clique, но я привык к healbot), передавая действия мыши на хилера. Попробую так же разметить область над Healbot'ом и использовать MouseIsOverWindowRect, ну а там как пойдет. Как протестирую отпишусь если не забуду ;)
(Хочется добиться такого же результата, когда держишь W на танке, он двигается, а работа с мышкой не прерывает действий в основном окне, в isboxer это легко реализуется через Repeater Regions)
Разбил комент на части, так как сайт ругается
Evgeniy
Конечно hotkeynet до isboxer далеко, но зато бесплатно и в определенных случаях даже более работоспособно.
Очень жаль, что автор программы забросил ее. Еще столько всего можно добавить, удалить разные ограничения. Добавить какие либо функции, где можно выполнять математические операции, сделать ее более похожей на язык программирования
Pashted
Есть аналогичная программа, работающая на самописных скриптах, AutoHotkey. Я в нее не углублялся и переводить времени нет, но с виду достаточно мощная штука со своим более продвинутым синтаксисом. В интернете можно найти инструкции на русском.
Evgeniy
Я как то пробовал на ней, работает. Но тут можно потратить столько времени и сил изучая и пробуя все это что бы понять, что это не подходит :)
Передавать нажатие клавиш это решаемо, ahk гораздо более гибкий, действительно много возможностей, делай что хочешь. Как то делал на ней автоматического хиллера ориентируясь на цвета пикселей в нужных местах, а вот реализовать передачу мышки в фоновые окна без потери фокуса основного это уже возможно задачка. Вот в чем isboxer выигрывает, но как сказал выше не попробуешь не узнаешь