Содержание

    Основы написания скриптов HotkeyNet

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

    Основы написания скриптов HotkeyNet

    Подождите! Я не собираюсь лезть в программирование - оно мне не интересно. Я просто хотел поиграть!

    Это можно понять. Если вы ищите готовое решение и не собираетесь продумывать поведение персонажей в той или иной ситуации, для вас есть более простые пути:

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

     

    Назначение горячих клавиш

    Ниже вы видите пример назначенного сочетания клавиш. Необходимо сохранить этот код в скрипте того компьютера, на котором клавиша нажимается:

    <Hotkey Ctrl F3>
    <SendPC local>
    <SendWin Ubertastic>
    <Text Hello!>

    Каждая строка из данного кода передает в HotkeyNet один из четырех фрагментов информации, необходимых для правильной работы:

    1. Клавиши, которые вы нажимаете для вызова действия. В данном случае это Ctrl+F3.
    2. Компьютер, на котором будет набран текст или произведено какое-либо другое действие. В нашем примере это локальный компьютер, на котором и было нажато сочетание клавиш.
    3. Окно, в котором появится текст. Здесь это окно программы, называемой "Ubertastic".
    4. Выполняемое действие. В нашем случае HotkeyNet наберет текст "Hello!".

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

    Для получения понятных программе клавиатурных сокращений будет удобно воспользоваться встроенными в HotkeyNet возможностями. В правом верхнем углу основного окна отображается информация о последней нажатой клавише, которая может быть использована в скриптах.

     

    Триггеры и модификаторы

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


    Вот простой образец триггера:

    <Hotkey F1>


    Далее триггер с одним обычным модификатором:

    <Hotkey RCtrl F1>


    А это пример с пользовательским модификатором:

    <UseKeyAsModifier Esc>

    <Hotkey Esc F1>


    С такой комбинацией переключаемых модификаторов триггер F1 сработает только когда NumLock включен, а ScrollLock выключен:

    <Hotkey NumLockOn ScrollLockOff F1>


    Усложним задачу, используя разные типы модификаторов:

    <UseKeyAsModifier Esc>

    <Hotkey LShift LCtrl NumLockOn Esc F1>


    Более подробная информация о триггерах содержится здесь.

     

    Примеры горячих клавиш

    Ниже приведен пример горячей клавиши, контролирующей двух персонажей одновременно. Один из них находится на том же компьютере, с которого вызывается горячая клавиша (на локальном компьютере). Другой на компьютере с IP-адресом 192.168.1.102. Обратите внимание, горячая клавиша выполняет разные действия на двух машинах. Она вводит текст "Hello!" на первом и нажимает клавишу F1 на втором.

    <Hotkey NumpadEnter>
    <SendPC local>
    <SendWin Ubertastic>
    <Text Hello!>
    <SendPC 192.168.1.102>
    <SendWin Ubertastic>
    <Key F1>


    Следующая горячая клавиша управляет двумя персонажами на одном и том же компьютере. Чтобы это стало возможным, у окон должны быть разные названия. Переименование окон мы рассмотрим чуть позже.
    Команда Restore после всех манипуляций активирует исходное окно, которое было на переднем плане до вызова клавиши. Это необходимо, потому что команда SendWin переводит окно на передний план перед отправкой символов. Можно воспользоваться SendWinM, чтобы избавиться от такого эффекта. Также вы можете использовать команду SetForegroundWin для перемещения конкретного окна на передний план.

    <Hotkey LAlt 4>
    <SendPC local>
    <SendWin UberOne>
    <Text Dance and sing!>
    <Key Enter>
    <SendWin UberTwo>
    <Key F1>
    <Restore>


    Этот пример похож на предыдущий. В нём используется SendWinM вместо SendWin, поэтому нет необходимости в конце восстанавливать состояние исходного окна:

    <Hotkey LAlt 4>
    <SendPC local>
    <SendWinM UberOne>
    <Text Dance and sing!>
    <Key Enter>
    <SendWinM UberTwo>
    <Key F1>


    Данная горячая клавиша поочередно переводит на передний план одно из окон на одном и том же компьютере:

    <Hotkey NumpadMinus>
    <SendPC local>
    <ToggleWin UberOne UberTwo>

     

    Одновременное назначение большого количества горячих клавиш

    До сих пор в этой инструкции мы назначали одну горячую клавишу за раз. Например, этот фрагмент кода назначает действие на единственную клавишу X:

    <Hotkey X>
    <SendPC 192.168.1.101>
    <SendWin WoW1>
    <Key X>


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

    <Hotkey X, Y, Z> 
    <SendPC 192.168.1.101>
    <SendWin WoW1>
    <Key %Trigger%>

    Когда HotkeyNet загружает такой код, он делит его на три отдельных горячих клавиши: одна для X, одна для Y и одна для Z. В каждом случае специальное слово %Trigger% заменяется вызывающим триггером. Вы можете увидеть развёрнутый план всех назначенных клавиш, нажав кнопку "Show loaded hotkeys" в правом нижнем углу:


    Вы не ограничены тремя клавишами. Такая запись назначает 48 горячих клавиш:

    <Hotkey A-Z, 0-9, F1-F12>
    <SendPC 192.168.1.101>
    <SendWin WoW1>
    <Key %Trigger%>


    Но всё это ерунда по сравнению со следующим примером, в котором назначены почти 400 горячих клавиш одновременно:

    <Hotkey AllMainKeys; Shift AllMainKeys> 
    <SendPC 192.168.1.101>
    <SendWin WoW1>
    <Key %Trigger%>

    Приведенный пример лишь немного раскрывает богатые возможности списков клавиш. Более подробная информация указана в описании команд Hotkey и KeyList.

     

    Движение

    Чтобы заставить персонажей в играх двигаться, вам потребуется специальный тип горячей клавиши, которая остаётся нажатой столько, сколько вы удерживаете нажатым триггер. Если назначаемая горячая клавиша контролирует движение в двух или более окнах на одном и том же компьютере, для передачи нажатий используйте команды SendWinM или SendWinS.

    Есть два способа применения такого вида горячих клавиш: простой и сложный.

     

    Простой способ

    Шаг 1. Создать метки для окон. Каждая метка имеет имя, IP-адрес, способ передачи и название окна:

    <Label player1 local SendWinM WoW1>
    <Label player2 192.168.1.101 SendWinM WoW2>


    Шаг 2
    . Назначить горячие клавиши при помощи MovementHotkey. Этот пример добавляет восемь горячих клавиш:

    <MovementHotkey W, A, S, D, Up, Down, Left, Right>
    <SendLabel player1, player2>
    <Key %Trigger%>

     

    Сложный способ

    Для случаев, когда требуется совершить более сложное действие, существует другой метод назначения клавиш движения. Основная идея заключается в том, что добавляются две горячие клавиши. Первая определяет, что произойдет при нажатии на триггер, а вторая - при его отпускании. Вторая клавиша использует команду HotkeyUp вместо Hotkey.

    Например, ниже назначены клавиши, которые заставляют двух персонажей расходиться в разные стороны. В первой части клавиши нажимаются при помощи KeyDown. Во второй части клавиши отпускаются командой KeyUp. Если вы хотите, чтобы горячая клавиша совершала действие, несвязанное с движением, его можно написать обычным образом в первой части под Hotkey.

    <Hotkey F1>
    <SendLabel player1>
    <KeyDown Q>
    <SendLabel player2>
    <KeyDown E>

    <HotkeyUp F1>
    <SendLabel player1>
    <KeyUp Q>
    <SendLabel player2>
    <KeyUp E>

     

    Переименование окон

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

     

    Для решения этой проблемы вам нужно переименовать одно или оба окна так, чтобы каждое имело уникальное имя:

     

    Ручное переименование

    HotkeyNet позволяет переименовывать окна четырьмя различными способами. Чтобы сделать это вручную, перейдите в меню "Actions > Rename a window" или выберите этот пункт из контекстного меню в системном трее. Откроется панель переименования. Правой кнопкой мыши нажмите на заголовок вверху окна, которое вы собираетесь переименовать, и введите новое имя в панели:

     

    Переименование с использованием исходного названия

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

    <Hotkey Ctrl R>
    <SendPC local>
    <RenameWin IrfanView IrfanOne>
    <RenameWin IrfanView IrfanTwo>

    Эта горячая клавиша переименовывает первый экземпляр программы IrfanView на "IrfanOne" и второй на "IrfanTwo".


    Если название содержит пробелы, заключите его в кавычки:

    <RenameWin "Dark Age of Camelot" "DAOC 1">

     

    Переименование с использованием пути к файлу

    Третий способ переименования окон основан на горячей клавише с указанием пути к исполняемому файлу игры:

    <Hotkey Ctrl R>
    <SendPC local>
    <RenameFromPath "C:\Uber\Uber.exe" Uber1>


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

    <RenameFromPath "C:\Uber\" Uber1>

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

     

    На заметку игрокам World of Warcraft

    WoW не позволяет переименовывать окна командой RenameFromPath. Воспользуйтесь другим методом.

     

    Переименование окна, взятого в цель

    Четвёртый способ переименования заключается в применении горячей клавиши с командой RenameTargetWin. Она похожа на RenameWin, которую мы рассматривали выше, но иногда эта команда удобнее. Подробности можно узнать в описании.

     

    Отправка нажатий в окна

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

     

    SendWin

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

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

    Потому что SendWin может передавать нажатия только в активные окна. Такие окна находятся поверх остальных.

    Применив SendWin к неактивному окну (фоновому), HotkeyNet переместит его на передний план так, будто вы переключились на него сочетанием Alt+Tab, и передаст в него нажатие. Это работает вполне нормально, но немного медленно, потому что переключение отнимает время. Вернуть исходное окно в активное состояние можно командой Restore.

    Выводы:

    • Для отправки нажатий клавиш в активное окно используйте SendWin, потому что этот метод отлично работает.
    • Если при передаче нажатий в фоновое окно вас не беспокоит небольшая задержка от переключений, используйте команду SendWin, потому что она доставляет в окно каждую строку корректно и без сбоев.
    • Если вы хотите передавать нажатия в фоновое окно без переключения на него, смотрите более подробную информацию в следующей секции "Передача нажатий в фоновые окна".

     

    SendFocusWin

    Это другой способ отправки нажатий в активное окно. SendFocusWin работает также, как и SendWin, за исключением того, что передаёт нажатия в активное на данный момент окно (то, которое получило бы нажатие с клавиатуры, переданное обычным образом без HotkeyNet). SendWin доставляет нажатия в те окна, которые были определены по их названиям. С другой стороны, SendFocusWin никогда не перемещает окна на передний план, потому что целевое окно уже активно и находится на переднем плане.

     

    Передача нажатий в фоновые окна

    Система Windows не приспособлена для передачи нажатий в неактивные окна. HotkeyNet приходится идти на хитрости при работе с Windows API и результаты не идеальны.

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

    HotkeyNet предлагает четыре способа отправки в фоновые окна: SendWinM, SendWinS, SendWinMF и SendWinSF.

     

    SendWinM

    SendWinM использует сообщения Windows "WM_KEYDOWN" и "WM_KEYUP" для доставки нажатий. Преимущество SendWinM в том, что вам не нужно менять настройки. Просто примените команду в горячей клавише и, если отправка возможна, то она сработает.

     

    SendWinMF

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

    Недостаток в том, что для нормальной работы обычно приходится регулировать задержки до и после отправки. Сделать это можно через меню "Options > Send Mode Settings > Background focus delays" или командой SetBackgroundFocusDelays в скрипте. Подробности смотрите в описании SendWinMF.

     

    SendWinS и SendWinSF

    SendWinM и SendWinSF похожи на только что описанные методы. Разница в том, что они используют функцию операционной системы "SendMessage" вместо "PostMessage". Подробнее об их работе можно узнать в описании.

     

    Ограничения

    Фоновые режимы отправки нажатий работают с некоторыми приложениями, но не со всеми.

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

    Если вы хотите, чтобы соблюдался регистр передаваемых символов (большие и заглавные буквы), используйте новую версию SendWinS или SendWinSF. Выбрать новую версию можно в меню "Options > Send Mode Settings > Use new SendWinS and SendWinSF".

     

    На заметку игрокам World of Warcraft

    Как уже было сказано, SendWinMF добавляет незначительные задержки. Это делается только по техническим причинам, и стандартные значения слишком малы, чтобы повлиять на игру. Если вас беспокоит то, что эти задержки могут нарушать правила World of Warcraft, используйте вместо этой команды SendWinM. SendWinM прекрасно работает при отправке одиночных нажатий в WoW. SendWinMF требуется только для отправки команд в чат, что может нарушать правила по другим причинам.

     

     

    На этом вводная часть заканчивается. Этого будет достаточно, чтобы понимать содержание скрипта и уметь его правильно изменить. Если вам показалось недостаточным то, что вы узнали из этой статьи, вас ждёт продолжение под названием Подробнее о скриптах HotkeyNet.

     


    Понравился материал? Расскажи друзьям!

    Комментарии (9)
      • автор

      Pashted

      написал 8 лет назад

      Если возникнут вопросы по скриптам HotkeyNet, можете задавать их здесь.

      Kolzx

      написал 7 лет назад

      Что может быть не так ?
      задача - дублирование кнопок в 3+ окон LotRo
      взял простейший скрипт для разобраться с программой
      запуск 3-х клиентов - норм
      переименование окон - норм
      а дальше начинаются проблемы
      команда SendWin корректно отправляет во все 3 окна положенную кнопку.
      SendWinM(MF,S,SF) кнопки не отправляют, хотя в логе указано что в нужные окна команды отправлены. пробовал менять настройки задержки (второй диапазон от 10 до 360 разные пробовал), галочки для *новых* версий ставил\убирал...

      с простой командой SendWin не срабатывают (точнее дёрнется разок и на етом всё)

        • автор

        Pashted

        написал 7 лет назад

        Для начала хотелось бы прояснить момент "дёрнется разок и на этом всё". Из этого можно сделать вывод, что кнопки работают нормально, но вы пытаетесь реализовать движение персонажей. Для этого лучше воспользоваться специальными макросами в игре для следования за главным персонажем (follow), а кнопки движения отключить вообще, и управлять движением из основного окна.

        Если же управление планируется построить иначе, попробуйте отправлять нажатия через указание двух клавиш: нажатие/отпускание. Примеры есть в этой статье, раздел "Движение".
        Также стоит попробовать вставить задержки внутри тела горячей клавиши командой Wait.

        Известно, что Lotro не воспринимает нажатия, когда окно неактивно, то есть нажатия доставляются в окна только командой SendWin (или SendFocusWin).

      Sajko

      написал 7 лет назад

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

      ALFA

      написал 7 лет назад

      Не нашел как в личку задать вопрос на сайте. Напишу тут, а там разместите где удобно.
      Вопросов на самом деле очень много ))) ибо таких возможностей от программы я и не ожидал увидеть. Но начну с простых, которые не дают покоя.
      Вопрос первый.
      На БГ команда фоллоу не работает. А по сему пока могу играть только лишь в мире ... Как сделать, что бы ведомые следовали за главным и на БГ? Jamba так же не включает автоследование. Но видел на БГ мультибоксера, а значит выход есть ))) и это радует.
      Втопрос второй.
      Мне требуется перед использованием каста, прожать усиление (тоже каст). Это усиление имеет ГКД. Т.е. вариант как с тринькой не прокатывает у триньки ГКД отсутствует.
      Подскажите как это сделать ...

        • автор

        Pashted

        написал 7 лет назад

        1. Команда follow не работает на бг, начиная с Пандарии. Это сделано компанией Blizzard в ответ на жалобы простых игроков. Когда-то были способы обхода этого ограничения. Некоторые соображения по этому поводу можно посмотреть тут: https://vk.com/topic-10064079_33664704.

        2. Лучше всего это сделать при помощи переключателя. То есть, нужно разделить горячую клавишу в скрипте на два этапа командой toggle. Первое нажатие выполнит первый шаг, второе - второй. Подробности с примерами есть здесь.

          ALFA

          написал 7 лет назад

          По поводу БГ по ссылке нет никаких соображений. (((

            • автор

            Pashted

            написал 7 лет назад

            Цитирую...
            "Чтобы персы следовали за главным - нужно призвать спутника, всем забить сумки (чтобы не было свободного места) , добавить его в фокус и включить опцию клик-ту-мув. Делаем макрос /target focus и в исбоксере биндим его на 1 клавишу с взаимодействие с целью. Жмякаем - все бегут за спутником."

            Также есть смысл расспросить тех мультибоксеров, которые смогли обойти ограничение на вашем сервере. Либо продублируйте вопрос в нашей группе ВК https://vk.com/multiboxing.

    Оставить комментарий
    Пожалуйста, авторизуйтесь, чтобы оставлять комментарии.