#UseHook
Gui, Add, CheckBox, x10 gCheckBox vDelayShoot, On / Off Стрельбу на эту клавишу
Gui, Add, Edit, x10 w40 Center Number Limit4 gEdit vInShootValue, % InShootValue := 300
Gui, Add, Text, yp x+10, Время зажатия стрельбы
Gui, Add, Edit, x10 w40 Center Number Limit4 gEdit vUnShootValue, % UnShootValue := 150
Gui, Add, Text, yp x+10, Время между зажатиями
Gui, Add, Edit, x10 w250 Center ReadOnly gCheckBox HWNDvMyHotkey, X
Gui, Add, Text, Center, Горячая клавиша, `nкоторую надо зажать для стрельбы
HF_HotkeyUserFunc("vMyHotkey") , MyHotkey := "vk58"
Gui, Show, , New GUI Window
Return
CheckBox:
Hotkey, %PrMyHotkey%, DelayShoot, UseErrorLevel Off
PrMyHotkey := MyHotkey
GuiControlGet, DelayShoot
Hotkey, %MyHotkey%, DelayShoot, % (DelayShoot = 1) ? " UseErrorLevel On" : " UseErrorLevel Off"
return
Edit:
GuiControlGet UnShootValue
GuiControlGet InShootValue
Return
DelayShoot:
ToolTip % "Подпрограмма - " A_ThisLabel "`nКнопка - " HF_ReadVar(A_ThisHotkey) "`nInShootValue = " InShootValue "`nUnShootValue = " UnShootValue
return
; --------------- Далее библиотека, которую по чудесным и необъянимым причинам нельзя загрузить директивой #Include ----------------------------------------------
HF_HotkeyUserFunc(HF_Control) { ;***
Global
Loop, Parse, HF_Control, |
HF_Ceil := Ceil(%A_LoopField%) , HF_Control_%HF_Ceil% := SubStr(A_LoopField, 2)
HF_ModButtons := {"vkA4":"Alt","vkA5":"Alt","vkA2":"Ctrl","vkA3":"Ctrl","vkA0":"Shift","vkA1":"Shift","vk5B":"Win","vk5C":"Win"}
HF_PrefMod := {"Alt":"!","Ctrl":"^","Shift":"+","Win":"#"}
HF_Buttons := "|vkBA|vkBB|vkBC|vkBD|vkBE|vkBF|vkC0|vkDB|vkDC|vkDD|vkDE|vk41|vk42|vk43|vk44|vk45|vk46|vk47|vk48|"
. "vk49|vk4A|vk4B|vk4C|vk4D|vk4E|vk4F|vk50|vk51|vk52|vk53|vk54|vk55|vk56|vk57|vk58|vk59|vk5A|"
OnExit, HF_Exit
SetBatchLines -1
HF_PID := DllCall("GetCurrentProcessId")
Return OnMessage(0x111, "HF_WaitControl")
HF_Exit:
DllCall("UnhookWindowsHookEx", UInt, HF_State)
Send, {LButton Up}{LCtrl Up}{RCtrl Up}{LShift Up}{RShift Up}{LAlt Up}{RAlt Up}{LWin Up}{RWin Up}
ExitApp
} ;**
HF_WaitControl( HF_Param, HF_Handle) { ;***
Global
If HF_Control_%HF_Handle% <>
{
HF_ControlName := HF_Control_%HF_Handle% , HF_HWNDControl := HF_Handle
If (HF_Param >> 16 = 0x100) ; EN_SETFOCUS
HF_State := DllCall("SetWindowsHookEx", Int, WH_KEYBOARD_LL := 13, UInt, RegisterCallback("HF_Write", "Fast")
, UInt, DllCall("GetModuleHandle", UInt, 0), UInt, 0) , HF_DelStr := ""
If (HF_Param >> 16 = 0x200) ; EN_KILLFOCUS
{
HF_UnHook()
Return
}
}
IfWinNotActive, ahk_pid %HF_PID%
HF_UnHook()
} ;**
HF_UnHook() { ;***
Global
DllCall("UnhookWindowsHookEx", UInt, HF_State)
HF_ModCtrl := HF_ModAlt := HF_ModShift := HF_ModWin := HF_PrefModCtrl := HF_PrefModAlt := HF_PrefModShift := HF_PrefModWin := HF_Prefix := HF_State := ""
If HF_DelStr = 1
GuiControl, , % HF_HWNDControl, % "Нет"
} ;**
HF_Write(HF_nCode, HF_wParam, HF_lParam) { ;***
Global
SetFormat, IntegerFast, H
HF_VkCode := "vk" SubStr( NumGet(HF_lParam+0), 3)
HF_D := ((NumGet(HF_lParam+0, 8) & 1) <<8) | NumGet(HF_lParam+0, 4)
HF_SCCode := "sc" SubStr((HF_D = 0x136 ? 0x36 : HF_D), 3)
IF (HF_wParam = 0x100 || HF_wParam = 0x104) ; WM_KEYDOWN = 0x100, WM_SYSKEYDOWN = 0x104
{
IF HF_IS_Mod := HF_ModButtons[HF_VkCode]
GoTo, HF_PressMod
GoTo, HF_Write
}
IF HF_IS_Mod := HF_ModButtons[HF_VkCode]
GoTo, HF_PressMod_Up
Return HF_nCode < 0 ? HF_CallNextHookEx(HF_nCode, HF_wParam, HF_lParam) : 1
HF_PressMod_Up:
HF_Mod%HF_IS_Mod% := HF_PrefMod%HF_IS_Mod% := ""
If (HF_Hotkey <> "")
Return HF_nCode < 0 ? HF_CallNextHookEx(HF_nCode, HF_wParam, HF_lParam) : 1
GoTo, HF_Write
HF_PressMod:
If HF_Mod%HF_IS_Mod% <>
Return HF_nCode < 0 ? HF_CallNextHookEx(HF_nCode, HF_wParam, HF_lParam) : 1
HF_Mod%HF_IS_Mod% := HF_IS_Mod "+" , HF_PrefMod%HF_IS_Mod% := HF_PrefMod[HF_IS_Mod] , HF_Hotkey := ""
HF_Write:
HF_IS_Mod <> "" ? (HF_KeyName := HF_Hotkey := HF_Prefix := "" , HF_DelStr := "1") : (HF_KeyName := GetKeyName(HF_VkCode HF_SCCode) , HF_DelStr := ""
, HF_Hotkey := (HF_Buttons ~= "\|" HF_VkCode "\|") ? HF_VkCode : HF_KeyName , HF_Prefix := HF_PrefModCtrl HF_PrefModAlt HF_PrefModShift HF_PrefModWin)
%HF_ControlName% := HF_Prefix HF_Hotkey
GuiControl, , % HF_HWNDControl, % HF_ModCtrl HF_ModAlt HF_ModShift HF_ModWin HF_KeyName = "" ? "Нет" : HF_ModCtrl HF_ModAlt HF_ModShift HF_ModWin HF_KeyName
Return HF_nCode < 0 ? HF_CallNextHookEx(HF_nCode, HF_wParam, HF_lParam) : 1
} ;**
HF_CallNextHookEx(nCode, wp, lp) { ;***
Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wp, UInt, lp)
} ;**
; -------------------------------------- Read --------------------------------------
HF_Read(Key, Section, Path) { ;***
Global HF_DelStr := ""
IniRead, Key, % Path, % Section, % Key, % A_Space
If Key =
Return "Нет"
RegExMatch(Rtrim(Key, "}"), "S)^([\^\!\+#]*)\{?(.*)", K)
Return RegExReplace(RegExReplace(RegExReplace(RegExReplace( K1,"\+","Shift+"),"\!","Alt+"),"\^","Ctrl+"),"#","Win+")
. (K2 ~= "^vk" ? GetKeyName(K2) : K2)
} ;**
HF_ReadVar(Key) { ;***
RegExMatch(Rtrim(Key, "}"), "S)^([\^\!\+#]*)\{?(.*)", K)
Return RegExReplace(RegExReplace(RegExReplace(RegExReplace( K1,"\+","Shift+"),"\!","Alt+"),"\^","Ctrl+"),"#","Win+")
. (K2 ~= "^vk" ? GetKeyName(K2) : K2)
} ;**
HF_ReadToSend(Key, Section = "", Path = "") { ;***
If (Section <> "")
IniRead, Key, % Path, % Section, % Key, % A_Space
Return RegExReplace( Key, "S)\w+", "{$0}")
} ;**