1

Тема: AutoHotkey: использование кнопки мыши вместо кнопки Ctrl

Исторически сложилось так, что большинство САМЫХ ГЛАВНЫХ по частоте употребления горячих клавишей в программах под Windows представляют собой комбинацию Ctrl с какой-либо, преимущественно буквенной, клавишей. В алфавитно-цифровые времена это было оправдано и удобно: обе руки постоянно находились над клавиатурой, и было легко мизинцем одной из них давить Ctrl, а пальцем другой — нужную букву. С появлением графического интерфейса ситуация кардинально изменилась: теперь правая рука значительную (у непродвинутых юзеров — бОльшую) часть времени проводит не на клавиатуре, а на мыши. Но традиционные горячие клавиши, тем не менее, все сохранились — от неизбежных Ctrl-C, Ctrl-V, Ctrl-A, Ctrl-Z, Ctrl-S до новомодных Ctrl-Tab, Ctrl-W, Ctrl-T, Ctrl-Enter и т. д.! И теперь приходится либо «гнуть пальцы», пытаясь нажимать эти комбинации одной левой, либо дергаться правой рукой с мыши на клавиатуру и обратно. Для сторонников «слепого метода», предполагающего принципиальный отказ от даже беглого взгляда на клавиатуру в целях поиска нужной клавиши, эта ситуация невыносима.
Между тем, ее можно почти кардинально разрешить, если позволить левой кнопке мыши работать как Ctrl! Это ничему не противоречит и ничему не мешает. Смотрите, как выглядит в этих условиях, например, операция копипейстинга слова в текстовом редакторе. Выделяем двойным кликом нужное слово, но после второго клика не отпускаем кнопку мыши, а, оставив ее нажатой, давим средним пальцем левой рукой кнопку C, не глядя на клавиатуру. Получилось Copy. Затем мышью помещаем курсор в нужное место, но после однократного клика, опять-таки, не отпускаем кнопку мыши, а вслепую жмем указательным пальцем левой руки клавишу V. Вышло Paste.
И так для любой операции по нажатию Ctrl-кнопка!
Так вот, благодаря AutoHotkey, назначения Ctrl-X на LeftButton-X, где X — любая клавиша, можно добиться всего одной короткой строчкой кода:

~LButton & x::Send ^x

Для русскоязычных пользователей эта строчка нуждается в небольшой коррекции:

~LButton & sc02D::Send ^{sc02D} ; используем вместо x ее сканкод 02D

(О необходимости применении сканкодов прекрасно и исчерпывающе написано здесь.)
Проблема, таким образом, принципиально решена. Но вот беда: разных Ctrl-клавишей, переназначенных подобным способом, необходимы ДЕСЯТКИ. И что же теперь — писать для каждой из них отдельную строчку? Это длинно и некрасиво. Однако, AutoHotkey, к сожалению, не позволяет использовать в качестве задания для горячей клавиши ФУНКЦИЮ: в этом качестве может фигурировать только ПОДПРОГРАММА! Возможно, в будущих версиях великий Крис Маллет ликвидирует этот недостаток, но пока он есть.
И я долго мучился в попытках его преодолеть. В конце концов таки преодолел! Решение получилось на диво кратким и, не побоюсь этого слова, красивым. Вот оно (поместите нижеследующий код в файл, например, LButtonCtrl.ahk, и запустите его дабл-кликом — при установленном AutoHotkey, разумеется):

#NoEnv ; стартовая мантра
SendMode Input

; список скан-кодов (разделенных знаком |) тех клавишей X (указаны в комментах),
; которые при нажатии LButton-X должны давать тот же результат, что и Ctrl-X
XKeys = 
(C Join| ; разрешить комменты в continuation section и связать строки знаком |
01E|02C|02D|02E|02F ; AZXCV
020|01F|031|025 ; DSNK
010|011|012|013|014|015|016|017|018|019 ; QWERTYUIOP
039|00F|01C|147|14F ; {Space}{Tab}{Enter}{Home}{End}
)
Loop Parse, XKeys, | ; назначаем каждому LButton-X ОДНУ И ТУ ЖЕ подпрограмму
  HotKey ~LButton & sc%A_LoopField%, CtrlX
CtrlX: ; подпрограмма превращения LButton-X в Ctrl-X
  X := SubStr(A_ThisHotKey, StrLen(A_ThisHotKey)-3) ; извлекаем сканкод X
  Send {Click up}^{sc%X%} ; и используем его для эмуляции Ctrl-X
return

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

2

Re: AutoHotkey: использование кнопки мыши вместо кнопки Ctrl

P.S. Забыл отметить, что скрипт написан для AutoHotkey версии 1.0.46 (ноябрь прошлого года) и с более ранними версиями работать не будет.