Table of Contents
Поделюсь одним из способов переназначить боковые кнопки у мышек. Это не универсальный рецепт, но зато он работает на безымянных устройствах и позволяет выполнять довольно сложные действия. Метод подходит и для переназначения клавиш клавиатуры.
1 Для каких устройств это нужно
Необходимость, как правило, возникает с устройствами, к которым производитель не приложил фирменный софт.
Возможно, добавление допклавиш не сильно удорожает себестоимость, поэтому две кнопки под большой палец правши — не редкость на мышках, заказанных на Алиэкспрессе.
Иногда производитель, даже если он опознаётся, не имеет не то что рекомендованной утилиты настройки, а даже собственного сайта! Мы получаем мышь, которая работает только так, как предлагает продавец, но это можно изменить.
По умолчанию боковые кнопки отправляют вперед и назад при навигации по сайтам и папкам, но это нужно не всем. Мне вот, например, удобно в браузере и во время игр регулировать громкость, в InDesign запускать скрипты, в Photoshop — менять размер кисти, а в VS Code запускать макросы вставки готового текста.
О кнопке DPI
Важный момент: кнопка переключения чувствительности курсора, находящаяся рядом с колёсиком — НЕ дополнительная. Как правило, она отвечает только за смену режима сенсора мыши на уровне программного обеспечения на плате устройства и переназначить её на дешёвых мышках невозможно. В среднем и высоком ценовых сегментах устройства настраиваются гибче, но статья не про них.
Для дорогих устройств от Logitech, Razer и прочих на сайтах производителей можно найти фирменную утилиту, которая не только поможет изменить поведение кнопок, но и подстроит чувствительность сенсора, цвет подсветки и, возможно, сварит кофе.
Встречаются промежуточные варианты, когда утилита есть, но она работает некорректно. Продукцию A4Tech можно хвалить за прекрасную эргономику мышек и ругать за странный софт. Об одной их старой утилите для серии мышей X7 я рассказывал в заметке про выбор грызуна, а вот с другой столкнулся недавно. Знакомьтесь: 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 отдельных нажатий (каждый раз громкость снижается на два пункта). Это неприемлемо.
2 Альтернативные способы
Прежде чем перейти к описанию переназначения клавиш с помощью AutoHotkey, расскажу, чем меня не устроили другие способы.
Мой список требований:
- Бесплатность решения или хотя бы лицензионная чистота. Сейчас софт купить сложно, поэтому этот пункт легко соблюсти только с бесплатным программным обеспечением.
- Стабильность и предсказуемость результата. Мне нужно, чтобы программа переназначала боковые клавиши мышки так, чтобы они вели себя как «родные», без пропусков и «залипаний».
- Влияние на производительность компьютера должно быть минимальным. Так как мышь подключена к старенькому нетбуку, для меня важно, чтобы утилита не сильно нагружала процессор. Gesture 16-in-1 Software, к примеру, постоянно занимает 3-5% процессорного времени — это мешает сбрасывать частоты CPU до минимума.
- Возможность учитывать контекст: в разных программах боковые клавиши должны выполнять разные функции.
Утилит переназначения клавиш много, платных и бесплатных, удобных и не очень: MKey, Key Manager, Keyboard Maniac и т.д. Все они не подошли как минимум по одному из пунктов. Фаворитом я бы назвал бесплатную MKey, но она, к сожалению, пытается ставить в довесок какие-то рекламные модули и в работе нагружает процессор. Среди испытанных в триальном режиме платных программ ни одного достойного варианта не обнаружил — везде свои недостатки.
Можно было бы пойти сложным путём и воспользоваться привычным мне инструментом автоматизации AutoIT, которым упрощаю рутинные действия при запуске некоторых программ. Увы, для переназначения кнопок мыши AutoIT подходит плохо: нужно самостоятельно указывать в скрипте вызовы API Windows и писать функции для установки обработчика нажатий и их перехвата. Учитывая не самый удобный синтаксис используемого языка программирования, написание утилиты для перехвата кнопок, по моим прикидкам, заняло бы несколько часов, что меня не устраивало. Да и статьи бы не получилось — я бы не стал рекомендовать столь сложный способ переназначить клавиши.
Но всё-таки я пришёл к выводу, что только написание своей миниатюрной программки позволяет минимизировать нагрузку на процессор ноутбука и добиться от кнопок мыши нужного мне поведения. Я пришёл к компромиссу, который устроил и относительной легкостью освоения, и гибкостью в подходе. Но самое главное: получаемые в итоге программки работают быстро, не нагружая процессор.
3 Переназначаем кнопки мыши с помощью AutoHotkey
AutoHotkey — не готовая утилита с набором настроек, а средство запуска макросов на собственном языке, заточенном под переназначение клавиш. С помощью несложных (относительно AutoIT и прочих подобных средств) скриптов можно на любую клавишу клавиатуры и мыши назначить практически что угодно: от имитации нажатия другой кнопки до сложных макросов со сдвигом курсора, запуском программ, изменением файлов.
Алгоритм действий такой:
- Создаем текстовый документ с расширением .ahk.
- Открываем каталог с этим документом — правой кнопкой мыши по файлу — Run Script.
- Если не было ошибок в коде, то AutoHotkey запустит макрос, которым можно манипулировать через меню значка в трее панели задач. Иначе программа выведет описание ошибки и номер строки в коде.
- После того, как вы убедились, что скрипт делает то, что задумывалось, можно через контекстное меню файла вызвать пункт «Compile Script». Скрипт скомпилируется в полноценную программу, которую можно запускать на устройствах без установленного AutoHotkey.
Где скачать
Официальный сайт программы AutoHotkey: www.autohotkey.com. Я использую версию 1.1, она же «current» в момент написания этой заметки.
Три совета:
- Для редактирования скриптов рекомендую бесплатный Notepad3. Подсветка синтаксиса там работает «из коробки».
- Не забывайте после редактирования применять изменения с помощью пункта меню «Reload This Script».
- Фигурные скобки важны. Синтаксис языка скриптов AutoHotkey таков, что можно их опускать, но я рекомендую ставить их везде, где только можно. Это важно для деления действий по смыслу и упрощает чтение кода.
За русскоязычную документацию благодарю Якова Симакова, создавшему сайт ahk-wiki.ru. Там вы найдете и краткий курс, и советы для сложных действий. Коды клавиш хранятся на трех страницах: для считывания клавиатуры, для переназначения кнопок мыши и для имитации нажатий.
Синтаксис языка AutoHotkey довольно прост, поэтому заняться написанием скриптов могут даже те, кто ни разу не сталкивался с программированием. Чтобы упростить вникание или даже обойтись без него, я сосредоточусь на готовых примерах того, как можно повесить на кнопки мыши разные действия.
4 Простое переназначение клавиш мыши
Итак, у вас «обычная» мышка от безымянного или не именитого бренда, в которой боковые клавиши работают как кнопки «Вперед» и «Назад» для путешествия по истории браузера. Значит, они видны в системе и драйвер мыши сообщает программам, что нажаты кнопки, которые в AutoHotkey обозначены как XButton1 («Назад») и XButton2 («Вперед»).
Чтобы заменить одни клавиши на другие, достаточно написать в файле макроса с расширением .ahk две строчки:
XButton1::Send {Volume_Down} XButton2::Send {Volume_Up}
Код понятен по смыслу: XButton1 и XButton1 — это условные названия кнопок, соответствующие боковым клавишам моей мыши. У вас они могут быть другие. В фигурных скобках указаны названия виртуальных кнопок, на которые следует переназначить выбранные боковые кнопки мыши. Символы {} здесь нужны для указания, что нужно не печатать такой текст, а нажимать клавишу с именем.
Скрипт AutoHotkey запускается легко — двойным щелчком по документу или через контекстное меню.
После запуска в трее появится значок запущенного скрипта с собственным меню:
Проверить работу нашей мини-программки легко: при нажатии на боковые клавиши появится системный индикатор смены громкости.
Вместо отправки других клавиш можно запрограммировать запуск программ. Например, повесить на одну клавишу запуск Калькулятора, а другая будет минимизировать активное окно.
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, если планируете использовать переназначение клавиш на другом ПК.
5 Повторение действия при зажатии кнопки мыши
Можно было бы остановиться на примитивном переназначении вида «кнопка мыши -> клавиша клавиатуры», но вот незадача: кнопки мыши не имеют функции повторения нажатия. Если на клавиатуре зажать и не отпускать какую-либо клавишу, то она срабатывает, затем спустя небольшую паузу начнет повторять действие, пока не уберёте палец. Такого автоповтора у мыши нет, так как курсором нужно что-то перетаскивать, то есть выполнять долгие по времени и не повторяющиеся операции. Поэтому переназначение клавиш из простых примеров работает с недостатком: зажатие боковых кнопок вызывает имитацию нажатия и отпускания кнопки только один раз. Чтобы убавить или прибавить громкость, придется нажимать кнопки много-много раз.
Автоповтор — прерогатива контроллера в клавиатуре или драйвера в операционной системе, но можно имитировать его поведение. При нажатии кнопки мыши после небольшой паузы будем запускать цикл, проверяющий, нажата ли кнопка мыши, и если да — снова вызывать нажатие виртуальной кнопки регулировки громкости (у вас это может быть другая кнопка или действие, не забывайте об этом).
Чтобы проверить свою идею, набросал вот такой скрипт:
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
Да, он стал сложнее на вид, но логика проста до примитивности. Что тут происходит при нажатии кнопки мыши:
- Имитируется нажатие мультимедийной кнопки «Громкость вверх» или «Громкость вниз».
- Выполняется пауза в 500 мс (полсекунды).
- Запускается цикл с проверкой: нажата ли клавиша?
- Если нет — цикл прерывается.
- Если да — происходит пауза в 50 мс и снова нажимается клавиша регулировки громкости.
С помощью данного скрипта AutoHotkey можно плавно регулировать громкость без лишних кликов мышью.
Если что, для кнопок клавиатуры такие ухищрения не требуются.
6 Идём дальше: разные действия в зависимости от окон
На этом я не успокоился. Во-первых, из-за дублирования кода получается слишком много строк. Если я захочу использовать имитацию большего количества клавиш, скрипт станет несуразно длинным. Во-вторых, я хочу разное поведение в разных программах. Значит, нужно добавлять дополнительные проверки, что сделает код ещё более запутанным.
Проведем небольшой рефакторинг: вынесем имитацию физический клавиатуры в функцию 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, там работает подсветка синтаксиса.
Я понимаю, что введение функций и условий для не-программистов может стать непреодолимым барьером, поэтому ничего страшного, если вы остановитесь на предыдущем варианте и будете менять только назначение кнопок.
7 Разные действия в зависимости от окон и зажатой клавиши
В какой-то момент я понял, что скрипт выше неудобен тем, что регулировать громкость хочется и в браузере, при этом и регулировку масштаба терять не хочется. Поэтому я переписал скрипт, добавив еще одно условие: зажатие клавиши 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 уместилось ровно в высоту экрана, поэтому смог сделать скриншот:
8 Два нюанса скриптов AutoHotkey
Иногда нужно запускать скрипт от имени администратора
В какой-то момент вы обнаружите, что переназначение работает не везде. В программах, запущенных с повышенными системными привилегиями (проще говоря, от имени администратора) переназначение клавиш не будет работать.
Чтобы перехватывать нажатия клавиш, нужно внедриться в процесс запущенной программы, чьё окно активно в данный момент. Именно поэтому запущенный без повышенных привилегий скрипт не работает в программах, запущенных под именем администратора. Вы можете каждый раз запускать скомпилированный скрипт AutoHotkey от имени администратора вручную, но есть способ автоматизировать это дело.
Решение: скомпилируйте скрипт в .exe программу и добавьте ее через системный Планировщик заданий. Вы найдете эту программу через меню Пуск. В её окне смотрите справа раздел «Действия» — жмите пункт «Создать задачу». Затем:
- Вкладка «Общие»: «Имя» — любое, поставьте галку на «Выполнить с наивысшими правами».
- Вкладка «Триггеры»: «Создать» — «При входе в систему» — выберите своего пользователя — ОК.
- Вкладка «Действия»: «Создать» — укажите путь до скомпилированного скрипта — ОК.
Теперь скрипт переназначения кнопок мыши будет самостоятельно запускаться при включении компьютера и работать в любом окне.
Сетевые игры и AutoHotkey несовместимы
Существуют целые сообщества любителей скриптов, упрощающих действия в играх и даже ломающих игровые механики. Особо «полезные» скрипты умудряются продавать, но речь не об этом.
Если у вас будет запущен скрипт AutoHotkey в то время, как вы играете в игру с античит-системой, велика вероятность получить бан. Вам даже не требуется нажимать кнопки, на которые назначены скрипты — бан произойдет по другой причине. Как я объяснил выше, для отслеживания нажатия скрипту требуется внедриться в процесс. Для сетевых игр, как правило, такое действие равнозначно читерству, поэтому бана не избежать.
Кто-то мне может возразить, что у него AutoHotkey или какое-то другое средство автоматизации во время игр работает без последствий — насчет этого спорить не буду, потому что игр разных много, от нечистоплотных пользователей защищаются разными способами. Моя позиция такова: бан за факт использования AutoHotkey — это глупость, потому что без них тяжело или невозможно играть людям с ограниченными возможностями.