Тема: AHK: Рабочий скрипт одиночного/двойного/удержания нажатия на клавишу
Мне понадобился скрипт, что бы на одну клавишу поставить три действия/три функции и в результате получился почти универсальный скрипт.
Думаю, он может пригодиться для игр, т.е. для тех хочет сэкономить на клавишах или же упростить однотипные действия.
Скрипт практически переносим в другой скрипт, а для полной его мобильности следует сделать.
1. Вместо явного объявления клавиши RShift следует написать -
HotKey %имя переменной(клавиша)%, МеткаПодпрограммы, On
2. Заменить метки подпрограмм:
- RShift(1) и RShift(2)
- на %имя переменной(клавиша)%(1) и %имя переменной(клавиша)%(2) соответственно.
Я такой вариант не проверял, но должно работать.
И ещё заблокирован автоповтор (он в моём случае мешал) методом посылки нажатой клавиши (RShift)
Send, {%сBaseKey% Down}
KeyWait, % A_ThisHotkey
Send, {%сBaseKey% Up}
Вот сам скрипт
;----- Общий вариант для RShift с фунцией посылки 1, 2 и 3 без автоповтора.
#Persistent
cAloneKey := "1"
cDoubleKey := "2"
cHoldingKey := "3"
сBaseKey := "RShift"
сPause_PressKey := 500
cCountHoldingBaseKey := 20
cWaitHoldingBaseKey := сPause_PressKey//cCountHoldingBaseKey
return
#UseHook, On
RShift::
if (fnHoldingBaseKey(cWaitHoldingBaseKey, cCountHoldingBaseKey)) ;Удержание
{
ToolTip, Удержание RShift = send %cHoldingKey%
Send, {%cHoldingKey% Down}
sleep 10
Send, {%cHoldingKey% Up}
Sleep, 1500
ToolTip
Send, {%сBaseKey% Down}
KeyWait, % A_ThisHotkey
Send, {%сBaseKey% Up}
return
}
else
Gosub, sbPressCountKeys
return
RShift(1): ;Одиночный
ToolTip, Одиночный RShift = send %cAloneKey%
Send, {%cAloneKey% Down}
sleep 10
Send, {%cAloneKey% Up}
Sleep, 1500
ToolTip
Send, {%сBaseKey% Down}
KeyWait, % A_ThisHotkey
Send, {%сBaseKey% Up}
Return
RShift(2): ;Двойной
ToolTip, Двойной RShift = send %cDoubleKey%
Send, {%cDoubleKey% Down}
sleep 10
Send, {%cDoubleKey% Up}
Sleep, 1500
ToolTip
Send, {%сBaseKey% Down}
KeyWait, % A_ThisHotkey
Send, {%сBaseKey% Up}
Return
#UseHook, Off
sbPressCountKeys:
;Если пауза меньше "сPause_PressKey" количества миллисекунд, то нажатие двойное, а если больше, то
; оно расценивается как 2 одиночных.
If not сSecond_PressKey
{
сSecond_PressKey := 1
SetTimer, sbDoublePressKey, -%сPause_PressKey%
}
Else
{
сSecond_PressKey := 0
SetTimer, %A_ThisHotkey%(2), -1
}
Return
sbDoublePressKey:
If not сSecond_PressKey
Return
сSecond_PressKey := 0
SetTimer, %A_ThisHotkey%(1), -1
Return
fnHoldingBaseKey(vSleep, vCount)
{
Global сBaseKey
while ((GetKeyState(сBaseKey, "P")) && vCount)
{
sleep %vSleep%
vCount--
}
if (vCount)
return false
return true
}
Если не нужна отладка, то везде убрать два фрагмента:
ToolTip, C текстом
и
Sleep, 1500
ToolTip
Оптимальные значения сPause_PressKey и cCountHoldingBaseKey для игр и мышки:
сPause_PressKey := 300, cCountHoldingBaseKey := 50
Для игры "The Witcher 2 - Assassins of Kings EE" это соотношение значений - 300 и 25
Лучше первое значение не трогать, т.е. сPause_PressKey := 300 или 500, а менять второе (число шагов цикла).
Если сPause_PressKey будет больше 500 или меньше 300, то будут проблемы с двойным нажатием и удержанием.
Eсли cCountHoldingBaseKey будет больше 75, то удержание вызовет одиночное нажатие.
P.S. По сути я этот скрипт писал для "The Witcher 2 - Assassins of Kings EE", т.к. там три клавиши достать/убрать серебряный меч, достать/убрать стальной меч и убрать оружие - это дело мне надоело, ну я сделал одну клавишу с тремя функциями
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019 Click to Download