Как настроить боковые кнопки мыши с помощью AutoHotkey

Чтение на 21 минут

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

Для каких устройств это нужно

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

Возможно, добавление допклавиш не сильно удорожает себестоимость, поэтому две кнопки под большой палец правши — не редкость на мышках, заказанных на Алиэкспрессе.

Какая-то мышь с Алиэкспресса

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

По умолчанию боковые кнопки отправляют вперед и назад при навигации по сайтам и папкам, но это нужно не всем. Мне вот, например, удобно в браузере и во время игр регулировать громкость, в InDesign запускать скрипты, в Photoshop — менять размер кисти, а в VS Code запускать макросы вставки готового текста.

О кнопке DPI

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

Для дорогих устройств от Logitech, Razer и прочих на сайтах производителей можно найти фирменную утилиту, которая не только поможет изменить поведение кнопок, но и подстроит чувствительность сенсора, цвет подсветки и, возможно, сварит кофе.

Встречаются промежуточные варианты, когда утилита есть, но она работает некорректно. Продукцию A4Tech можно хвалить за прекрасную эргономику мышек и ругать за странный софт. Об одной их старой утилите для серии мышей X7 я рассказывал в заметке про выбор грызуна, а вот с другой столкнулся недавно. Знакомьтесь: Gesture 16-in-1 Software.

Gesture 16-in-1 Software

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

Если вам повезло, то Gesture 16-in-1 Software сумеет перепрограммировать мышь так же, как это делает софт для более дорогих собратьев вроде A4Tech Bloody J90. Без назначения сложных макросов, но тем не менее: я был сильно удивлён, когда при настройке беспроводной мыши A4Tech FStyler FG30 после нажатия Apply появился прогресс-бар выгрузки настроек прямо в мышь. После утилита уже не требовалась — переназначенные допклавиши устройства помнят о своём новом предназначении на любом ПК и в любой операционной системе.

А вот с более продвинутой A4Tech Fstyler FB35 Icy White, которой часто пользуюсь из-за того, что она умеет подключаться по Bluetooth, т.е. без донгла, занимающего порт USB, случился облом: утилита должна быть запущена в фоне для переназначения кнопок в режиме реального времени. Мышь не программируемая, поэтому программе нужно отслеживать нажатия кнопок, чтобы перехватывать управление и вызывать самостоятельно запуск заданного действия. На практике перехват работает примерно 70% времени. Также нет обработки зажатия кнопки — действие срабатывает один раз, без повторения. Например, чтобы снизить громкость со ста до нуля процентов, придётся сделать 50 отдельных нажатий (каждый раз громкость снижается на два пункта). Это неприемлемо.

Альтернативные способы

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

Мой список требований:

  1. Бесплатность решения или хотя бы лицензионная чистота. Сейчас софт купить сложно, поэтому этот пункт легко соблюсти только с бесплатным программным обеспечением.
  2. Стабильность и предсказуемость результата. Мне нужно, чтобы программа переназначала боковые клавиши мышки так, чтобы они вели себя как «родные», без пропусков и «залипаний».
  3. Влияние на производительность компьютера должно быть минимальным. Так как мышь подключена к старенькому нетбуку, для меня важно, чтобы утилита не сильно нагружала процессор. Gesture 16-in-1 Software, к примеру, постоянно занимает 3-5% процессорного времени — это мешает сбрасывать частоты CPU до минимума.
  4. Возможность учитывать контекст: в разных программах боковые клавиши должны выполнять разные функции.

Утилит переназначения клавиш много, платных и бесплатных, удобных и не очень: MKey, Key Manager, Keyboard Maniac и т.д. Все они не подошли как минимум по одному из пунктов. Фаворитом я бы назвал бесплатную MKey, но она, к сожалению, пытается ставить в довесок какие-то рекламные модули и в работе нагружает процессор. Среди испытанных в триальном режиме платных программ ни одного достойного варианта не обнаружил — везде свои недостатки.

Можно было бы пойти сложным путём и воспользоваться привычным мне инструментом автоматизации AutoIT, которым упрощаю рутинные действия при запуске некоторых программ. Увы, для переназначения кнопок мыши AutoIT подходит плохо: нужно самостоятельно указывать в скрипте вызовы API Windows и писать функции для установки обработчика нажатий и их перехвата. Учитывая не самый удобный синтаксис используемого языка программирования, написание утилиты для перехвата кнопок, по моим прикидкам, заняло бы несколько часов, что меня не устраивало. Да и статьи бы не получилось — я бы не стал рекомендовать столь сложный способ переназначить клавиши.

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

Переназначаем кнопки мыши с помощью AutoHotkey

AutoHotkey — не готовая утилита с набором настроек, а средство запуска макросов на собственном языке, заточенном под переназначение клавиш. С помощью несложных (относительно AutoIT и прочих подобных средств) скриптов можно на любую клавишу клавиатуры и мыши назначить практически что угодно: от имитации нажатия другой кнопки до сложных макросов со сдвигом курсора, запуском программ, изменением файлов.

Алгоритм действий такой:

  1. Создаем текстовый документ с расширением .ahk.
  2. Открываем каталог с этим документом — правой кнопкой мыши по файлу — Run Script.
  3. Если не было ошибок в коде, то AutoHotkey запустит макрос, которым можно манипулировать через меню значка в трее панели задач. Иначе программа выведет описание ошибки и номер строки в коде.
  4. После того, как вы убедились, что скрипт делает то, что задумывалось, можно через контекстное меню файла вызвать пункт «Compile Script». Скрипт скомпилируется в полноценную программу, которую можно запускать на устройствах без установленного AutoHotkey.

Где скачать

Официальный сайт программы AutoHotkey: www.autohotkey.com. Я использую версию 1.1, она же «current» в момент написания этой заметки.

Три совета:

  1. Для редактирования скриптов рекомендую бесплатный Notepad3. Подсветка синтаксиса там работает «из коробки».
  2. Не забывайте после редактирования применять изменения с помощью пункта меню «Reload This Script».
  3. Фигурные скобки важны. Синтаксис языка скриптов AutoHotkey таков, что можно их опускать, но я рекомендую ставить их везде, где только можно. Это важно для деления действий по смыслу и упрощает чтение кода.

За русскоязычную документацию благодарю Якова Симакова, создавшему сайт ahk-wiki.ru. Там вы найдете и краткий курс, и советы для сложных действий. Коды клавиш хранятся на трех страницах: для считывания клавиатуры, для переназначения кнопок мыши и для имитации нажатий.

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

Простое переназначение клавиш мыши

Итак, у вас «обычная» мышка от безымянного или не именитого бренда, в которой боковые клавиши работают как кнопки «Вперед» и «Назад» для путешествия по истории браузера. Значит, они видны в системе и драйвер мыши сообщает программам, что нажаты кнопки, которые в AutoHotkey обозначены как XButton1 («Назад») и XButton2 («Вперед»).

Чтобы заменить одни клавиши на другие, достаточно написать в файле макроса с расширением .ahk две строчки:

XButton1::Send {Volume_Down}
XButton2::Send {Volume_Up}

Код понятен по смыслу: XButton1 и XButton1 — это условные названия кнопок, соответствующие боковым клавишам моей мыши. У вас они могут быть другие. В фигурных скобках указаны названия виртуальных кнопок, на которые следует переназначить выбранные боковые кнопки мыши. Символы {} здесь нужны для указания, что нужно не печатать такой текст, а нажимать клавишу с именем.

Скрипт AutoHotkey запускается легко — двойным щелчком по документу или через контекстное меню.

После запуска в трее появится значок запущенного скрипта с собственным меню:

В меню скрипта доступны разные действия

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

Стандартный индикатор громкости в Windows 10

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

XButton1::Run, calc.exe
XButton2::WinMinimize, A

Хотите задействовать клавиатуру? Нет проблем, добавим еще одну строчку, которая добавить запуск Блокнота по Ctrl+1.

XButton1::Run, calc.exe
XButton2::WinMinimize, A
^1::Run, notepad.exe

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

Чтобы скрипт запускался автоматически, закиньте файл или его ярлык в папку «Автозагрузка» меню Пуск: C:\Users\имя_пользователя\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\. Либо скомпилируйте программу через Build Script, если планируете использовать переназначение клавиш на другом ПК.

Повторение действия при зажатии кнопки мыши

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

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

Чтобы проверить свою идею, набросал вот такой скрипт:

XButton1::
Send {Volume_Down}
Sleep 500
Loop
{
If !GetKeyState("XButton1","p")
{
Break
} else {
Sleep 50
Send {Volume_Down}
}
}
Return

XButton2::
Send {Volume_Up}
Sleep 500
Loop
{
If !GetKeyState("XButton2","p")
{
Break
} else {
Sleep 50
Send {Volume_Up}
}
}
Return

Да, он стал сложнее на вид, но логика проста до примитивности. Что тут происходит при нажатии кнопки мыши:

  1. Имитируется нажатие мультимедийной кнопки «Громкость вверх» или «Громкость вниз».
  2. Выполняется пауза в 500 мс (полсекунды).
  3. Запускается цикл с проверкой: нажата ли клавиша?
  4. Если нет — цикл прерывается.
  5. Если да — происходит пауза в 50 мс и снова нажимается клавиша регулировки громкости.

С помощью данного скрипта AutoHotkey можно плавно регулировать громкость без лишних кликов мышью.

Если что, для кнопок клавиатуры такие ухищрения не требуются.

Идём дальше: разные действия в зависимости от окон

На этом я не успокоился. Во-первых, из-за дублирования кода получается слишком много строк. Если я захочу использовать имитацию большего количества клавиш, скрипт станет несуразно длинным. Во-вторых, я хочу разное поведение в разных программах. Значит, нужно добавлять дополнительные проверки, что сделает код ещё более запутанным.

Проведем небольшой рефакторинг: вынесем имитацию физический клавиатуры в функцию ImitateKey.

XButton1::
ImitateKey("{Volume_Down}", "XButton1")
Return

XButton2::
ImitateKey("{Volume_Up}", "XButton2")
Return

ImitateKey(MyKeySend, MyKeyWait) {
Send %MyKeySend%
Sleep 500
Loop
{
If !GetKeyState(MyKeyWait,"p")
{
Break
} else {
Sleep 50
Send %MyKeySend%
}
}
}

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

  • Affinity Photo — вызываются клавиши Ctrl+= и Ctrl+-, регулирующие масштаб открытой фотографии.
  • Google Chrome — клавиши Ctrl+= и Ctrl+- регулируют масштаб страницы.
  • Visual Studio Code — клавиши Ctrl+C и Ctrl+V отвечают за копирование и вставку программного кода в редакторе.
  • Если открыто что-то другое — регулируется громкость.

На основе этого скрипта можно создавать свои варианты.

XButton1::
WinGetActiveTitle, Title
if Title contains Affinity Photo,Google Chrome
{
ImitateKey("^-", "XButton1")
Return
}
else if Title contains Visual Studio Code
{
ImitateKey("^c", "XButton1")
Return
}
else
{
ImitateKey("{Volume_Down}", "XButton1")
Return
}

XButton2::
WinGetActiveTitle, Title
if Title contains Affinity Photo,Google Chrome
{
ImitateKey("^=", "XButton2")
Return
}
else if Title contains Visual Studio Code
{
ImitateKey("^v", "XButton2")
Return
}
else
{
ImitateKey("{Volume_Up}", "XButton2")
Return
}

ImitateKey(MyKeySend, MyKeyWait) {
Send %MyKeySend%
Sleep 500
Loop
{
If !GetKeyState(MyKeyWait,"p")
{
Break
} 
else 
{
Sleep 50
Send %MyKeySend%
}
}
}

В коде вы увидите слишком много скобок, поэтому еще раз напомню: для редактирования .ahk файлов советую использовать бесплатный Notepad3, там работает подсветка синтаксиса.

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

Разные действия в зависимости от окон и зажатой клавиши

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

Если на клавиатуре Ctrl не нажата:

  • Везде регулируется громкость.

Если зажата Ctrl:

  • Affinity Photo — вызываются клавиши Ctrl+= и Ctrl+-, регулирующие масштаб открытой фотографии.
  • Google Chrome — клавиши Ctrl+= и Ctrl+- регулируют масштаб страницы.
  • Visual Studio Code — клавиши Ctrl+C и Ctrl+V отвечают за копирование и вставку программного кода в редакторе.
  • Если открыто что-то другое — регулируется громкость.

В этом нет ничего сложного: в блоках, отвечающих за переназначение XButton1 и XButton2, я вернул события регулировки громкости, затем добавил переназначения клавиш ^XButton1 и ^XButton2, что соответствует кнопкам мыши с зажатой Ctrl клавиатуры. Иными словами, с точки зрения скрипта я переназначил четыре клавиши, из которых две новые — это сочетание Ctrl и боковые кнопки мыши.

Также добавил отступы — так код читается лучше.

XButton1::
{
	ImitateKey("{Volume_Down}", "XButton1")
	Return
}

^XButton1::
WinGetActiveTitle, Title
if Title contains Affinity Photo,Google Chrome
{
	ImitateKey("^-", "XButton1")
	Return
}
else if Title contains Visual Studio Code
{
	ImitateKey("^c", "XButton1")
	Return
}
else
{
	ImitateKey("{Volume_Down}", "XButton1")
	Return
}

XButton2::
{
	ImitateKey("{Volume_Up}", "XButton2")
	Return
}

^XButton2::
WinGetActiveTitle, Title
if Title contains Affinity Photo,Google Chrome
{
	ImitateKey("^=", "XButton2")
	Return
}
else if Title contains Visual Studio Code
{
	ImitateKey("^v", "XButton2")
	Return
}
else
{
	ImitateKey("{Volume_Up}", "XButton2")
	Return
}

ImitateKey(MyKeySend, MyKeyWait) {
	Send %MyKeySend%
	Sleep 500
	Loop
	{
		If !GetKeyState(MyKeyWait,"p")
		{
		Break
		} 
		else 
		{
		Sleep 50
		Send %MyKeySend%
		}
	}
}

Окно Notepad3 уместилось ровно в высоту экрана, поэтому смог сделать скриншот:

Два нюанса скриптов AutoHotkey

Иногда нужно запускать скрипт от имени администратора

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

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

Решение: скомпилируйте скрипт в .exe программу и добавьте ее через системный Планировщик заданий. Вы найдете эту программу через меню Пуск. В её окне смотрите справа раздел «Действия» — жмите пункт «Создать задачу». Затем:

  1. Вкладка «Общие»: «Имя» — любое, поставьте галку на «Выполнить с наивысшими правами».
  2. Вкладка «Триггеры»: «Создать» — «При входе в систему» — выберите своего пользователя — ОК.
  3. Вкладка «Действия»: «Создать» — укажите путь до скомпилированного скрипта — ОК.

Теперь скрипт переназначения кнопок мыши будет самостоятельно запускаться при включении компьютера и работать в любом окне.

Сетевые игры и AutoHotkey несовместимы

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

Если у вас будет запущен скрипт AutoHotkey в то время, как вы играете в игру с античит-системой, велика вероятность получить бан. Вам даже не требуется нажимать кнопки, на которые назначены скрипты — бан произойдет по другой причине. Как я объяснил выше, для отслеживания нажатия скрипту требуется внедриться в процесс. Для сетевых игр, как правило, такое действие равнозначно читерству, поэтому бана не избежать.

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

Темы записей
Оставить комментарий

Добавить комментарий