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

Все что не попало под остальные категории
Ответить
macro_liker
Новичок
Сообщения: 1
Зарегистрирован: 11 июл 2021, 11:20
Репутация: 0

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

Сообщение macro_liker » 11 июл 2021, 17:37

Привет 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/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 все работает как нужно.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя