Ребинды для ОС Windows на AutoHotkey

Привет GeekBoards, привет сообщество!

Ниже будет черновик статьи про использование 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 конец

Запустив этот скрипт, стандартная функция клавиши CapsLock перестанет работать, а сочетания клавиш CapsLock + i, j, k, l будут посылать нажатия соответствующих стрелок. {Blind} позволяет использовать другие клавиши модификаторы вместе с эмулируемой клавишей. Таким образом сделав Ctrl + Alt + CapsLock + i будет отработано Ctrl + Alt + CapsLock + Up.
У данного подохода в ОС 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/21105-crazy-scripting-scriptlet-to-find-scancode-of-a-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 все работает как нужно.