Ниже будет черновик статьи про использование AHK(AutoHotkey) для софтварного ребинда клавиатуры под ОС Windows.
Кому интересна статья, прошу дать обратную связь по содержанию и ошибкам в тексте. Возможно надо что-то добавить?
После всех исправлений и корректировки прошу GeekBoards посмотреть, оценить и принять решение о публикации статьи на сайте.
Вступление
Вне зависимости от того, какая у Вас клавиатура, вероятнее всего у Вас возникало желание назначить на определенные кнопки свои собственные сочетания клавиш или просто поменять функции одной кнопки на другую. С переходом на 60% клавиатуры этот вопрос становится нетривиальным, в моем случае у меня есть несколько клавиатур разных производителей с разными опциями по программированию клавиш. У каких-то производителей эта опция реализована лучше, у каких-то хуже, а у каких-то совсем никак. Хотелось бы не зависеть от выбора решения предлагаемого производителем и найти обходной путь. К счастью, этот путь существует.
Чтобы не делать статью объемной и тяжелой для восприятия, я поставлю цель -- сделать программный ребинд обычной 60% клавиатуры, так, чтобы её поведение напоминало частично Vortex poker (10).
Для достижения поставленной цели нам понадобится AutoHotkey. К сожалению, этот софт является нативным только для Windows. Для других ОС, возможно я напишу отдельные статьи по ребинду в будущем.
AutoHotkey
AutoHotkey (autohotkey.com) -- издавна широко известное в узких кругах решение для написания макросов для Windows систем. Несмотря на большое сообщество и достаточно полную документацию, иногда возникают сложности в реализации тех или иных идей с помощью AutoHotkey.
Как это работает?
Кратко: Вы качаете дистрибутив с официального сайта, устанавливаете, пишете (или берете уже готовый) скрипт (с расширением файла .ahk), и запускаете его как обычный исполнительный файл (doubleclick или enter), в трее появляется соответствующая пиктограмма, всё – скрипт работает, в меню трея можно этот скрипт отключить.
За всеми дальнейшими подробностями прошу пожаловать на официальные ресурсы по AutoHotkey, т.к. это большая тема и она выходит за рамки данной статьи.
Для Windows 10 у AutoHotkey есть нюанс: некоторые вещи работают только при запуске скрипта из-под административной учетной записи.
Вы можете создать автономный .exe файл из .ahk скрипта с помощью стандартных средств AutoHotkey.
SCan codes
Перед тем как дать пример кода, важно понять что такое сканкоды (scancodes). Сканкоды используются как наименование какой-либо клавиши на клавиатуре. Хотя AutoHotkey поддерживает более простой метод обозначения клавиш (просто буква, например "f" или "ы"), использовать его повсеместно не рекомендуется. Причина в том, что конкретные буквы зависят от языковой раскладки, а сканкоды нет, таким образом посылая сканкод вместо простого имени клавиши, будет послан символ в зависимости от текущей языковой раскладки клавиатуры. Регистр также будет учтен.
Кратко: в большинстве случаев лучше использовать сканкоды. Как добывать сканкоды будет написано ближе к концу статьи.
Начальный скрипт
Ниже будет пример начального скрипта, который отключает клавишу CapsLock, для дальнейшего ее использования как модификатора, чтобы добиться ребинда стрелок на клавишах "i" "j" "k" "l".
Код: Выделить всё
;------------------------- rebind.ahk начало
;--- Script routine
;=== Хуки для клавиатуры и мыши
#installKeybdHook
#installMouseHook
;=== Сколько может быть послано нажатий без возникновения предупреждающего диалога
#MaxHotkeysPerInterval 100
;=== https://www.autohotkey.com/docs/commands/_NoEnv.htm
#NoEnv
;=== Не дает скрипту завершиться после запуска
#Persistent
;=== Не позволяет запускать более одной копии скрипта
#SingleInstance force
;=== Включить оповещния об ошибках (полезно при отладке)
#Warn
;=== Отключение CapsLock
SetCapsLockState, AlwaysOff
;=== Приоритет процесса -- высокий
Process Priority,,High
;=== Убираем задержки для нажатий клавиатуры и мыши, а также для окон.
SetKeyDelay, -1, -1, Play
SetMouseDelay, -1, Play
SetWinDelay, -1
;--- ARROWS
;=== Caps + i посылает Up (стрелка)
CapsLock & SC017::
Send {Blind}{Up}
return
;=== Caps + j посылает Left (стрелка)
CapsLock & SC024::
Send {Blind}{Left}
return
;=== Caps + k посылает Down (стрелка)
CapsLock & SC025::
Send {Blind}{Down}
return
;=== Caps + l посылает Right (стрелка)
CapsLock & SC026::
Send {Blind}{Right}
return
;------------------------- rebind.ahk конец
У данного подохода в ОС Windows есть небольшой недостаток – работа встроенных низкоуровневых сочетаний клавиш, типа Win + L. Хорошая новость в том, что их можно отключить с помощью групповых политик или в реестре. Без отключения встроенного сочетания клавиш Win+L, Win + CapsLock + l приведет не к растягиванию окна на правую сторону экрана, а к блокировке сессии текущего пользователя.
Дальше
Разобравшись с начальным скриптом двигаемся дальше. Код, который будет ниже достаточно добавить в конец файла rebind.ahk и перезагрузить скрипт (запустить скрипт заново, т. к. с настройкой #SingleInstance force, возможен запуск только одной копии скрипта).
Ниже по тому же принципу, что и ранее прописаны ребинды для клавиш Home, End, PgUp, PgDown, F1-F12.
Код: Выделить всё
;------------------------- дополнения I начало
;--- HOME END PGUP PGDOWN
;with u key -- PageUp
CapsLock & SC016::
Send {Blind}{PgUp}
return
;with o key -- PageDown
CapsLock & SC018::
Send {Blind}{PgDn}
return
; with h key -- home
CapsLock & SC023::
Send {Blind}{Home}
return
; with n key -- end
CapsLock & SC031::
Send {Blind}{End}
return
;--- F-KEYS
CapsLock & 1::
Send {Blind}{F1}
return
CapsLock & 2::
Send {Blind}{F2}
return
CapsLock & 3::
Send {Blind}{F3}
return
CapsLock & 4::
Send {Blind}{F4}
return
CapsLock & 5::
Send {Blind}{F5}
return
CapsLock & 6::
Send {Blind}{F6}
return
CapsLock & 7::
Send {Blind}{F7}
return
CapsLock & 8::
Send {Blind}{F8}
return
CapsLock & 9::
Send {Blind}{F9}
return
CapsLock & 0::
Send {Blind}{F10}
return
CapsLock & SC00C::
Send {Blind}{F11}
return
CapsLock & SC00D::
Send {Blind}{F12}
return
;------------------------- дополнения I конец
Ниже еще немного ребиндов. Использованы мультимедийные клавиши для управления браузером, уже без {Blind}. Win + Esc посылает сочетания клавиш Alt+F4. На 60% клавиатурах так проще на мой взгляд закрывать окно чем нажимать CapsLock + Alt + 4.
Код: Выделить всё
;------------------------- дополнения II начало
;--- UTILITY BINDINGS
; with Backspace key -- Del
CapsLock & BS::
Send {Blind}{Del}
return
;with P key -- PrintScreen
CapsLock & SC019::
Send {Blind}{PrintScreen}
return
; with Q key -- back
CapsLock & SC010::
Send {Browser_Back}
return
; with E key -- forward
CapsLock & SC012::
Send {Browser_Forward}
return
;Win + Esc = Alt + F4
#SC029::
#Esc::
Send !{F4}
return
;------------------------- дополнения II конец
Можно биндить спецсимволы по известным альткодам. Пример:
Код: Выделить всё
;=== Правый Альт + c = знак копирайта
RAlt & SC014:: ;mod+c = PrintCopyrightSign
SendEvent {U+2122}
return
Код: Выделить всё
;Win + f SC021
*#SC021::
;disabled by intent
return
Вместо таблицы с известными сканкодами рекомендую использовать скрипт (https://autohotkey.com/board/topic/2110 ... key/page-2)
Код: Выделить всё
;------------------------- scancode.ahk начало
SetFormat, Integer, Hex
Gui +ToolWindow -SysMenu +AlwaysOnTop
Gui, Font, s14 Bold, Arial
Gui, Add, Text, w100 h33 vSC 0x201 +Border, {SC000}
Gui, Show,, % "// ScanCode //////////"
Loop 9
OnMessage( 255+A_Index, "ScanCode" ) ; 0x100 to 0x108
Return
ScanCode( wParam, lParam ) {
Clipboard := "SC" SubStr((((lParam>>16) & 0xFF)+0xF000),-2)
GuiControl,, SC, %Clipboard%
}
;------------------------- scancode.ahk конец
https://www.autohotkey.com/docs/KeyList.htm
Там есть даже AppsKey и все кнопки для управления плеером.
Послесловие
Используя примеры кода выше, Вы точно сможете прописать свои простые ребинды и таким образом в независимости от того, какая клавиатура у Вас подключена в данный момент, Вы получите свой набор ребиндов. За более чем 10 лет использования AutoHotkey у меня ни разу не было с ним проблем в отношении вылетов/ошибок, поэтому я могу его рекомендовать.
Недостатоком AutoHotkey по сравнению с ребиндом в прошивке клавиатуры, очевидно будет отсутствие ребиндов вне ОС Windows, а так же в сессиях при удаленных подключениях к другим ОС, в том числе и Windows. Однако при запуске скрипта на машине с Windows к которой Вы подключаетесь через RDP все работает как нужно.