;----------------fnHotkey = основная функция генерации Hotkey--------------------------------------------
;На вход
;1-й Переменная это строка из INI содержащая клавиши не более трёх
;2-й Метка - она должна быть
;3-й Включит/выключить True/False. Включить по умолчанию
;4-й Проверять(по умолчанию) или не проверять. Рекомендуется не отключать, что бы избежать конфликтов.
;На выход
;Имя горячей клавиши(строка) ,а при ошибке авто-отработка и выход.
;Значения заносятся в массив.
;Выходит без проверки и действий при BaseHotkeyFS := False
fnHotkey(varKeyIn, varLabelIn, varStatusIn:=True, varСheckHotkeyIn:=True)
{
Global ;The directive "global" - should not be an empty string.
;Глобальные константы для справки
;cCrushItself - "$" Когда надо вызывать ту же клавишу внутри её вызова
;cCrushMore - это для 2-х и 3-х. Дополнить Hotkey "~", т.е. ~Ctrl & Win $10 (~^#10) что бы обойти левые и правые модификаторы
;cCrushAndSPS - это " & "
;Локальные для этой функции переменные(меняются), константы и массивы
Local i, j, iLoop, jLoop
Local vHotKeyWork, cMaxArHotKeyStr, arHotKeyStr, cMaxArHotKeyAsg, arHotKeyAsg, сHotKeyStrErr
;Thread, NoTimers
if (!StrLen(varKeyIn)) ; Проверка на пустые Hotkey клавиши
Goto lFnHotkeyExit
;Инициализация констант, переменных, массивов - это обязательно
i := 0, j := 0, iLoop := 0, jLoop := 0
vHotKeyWork := "", cMaxArHotKeyStr := 0, arHotKeyStr := [], cMaxArHotKeyAsg := 0, arHotKeyAsg := [], сHotKeyStrErr := ""
;------Начинаем работу------
;Расчёт и генерация строк и акнонимов, а так же сHotKeyStrErr если будет ошибка для Hotkey
arHotKeyStr := fnParseSPS(varKeyIn) ;Массив для текста клавиш - они нужны для построения акронимов
cMaxArHotKeyStr := arHotKeyStr.MaxIndex() ;Расчёт длины, т.е. числа клавиш
i := 0
Loop %cMaxArHotKeyStr%
{
i++
arHotKeyAsg[i] := fnAssigKey(arHotKeyStr[i])
}
cMaxArHotKeyAsg := arHotKeyAsg.MaxIndex()
;Построение сочетания клавиш для Hotkey(vHotKeyWork) и генерация строки клавиш для ошибки(сHotKeyStrErr)
i := 0, vHotKeyWork := "", сHotKeyStrErr := ""
Loop %cMaxArHotKeyAsg%
{
i++
If (i = 1)
сHotKeyStrErr := arHotKeyStr[i]
Else
сHotKeyStrErr := сHotKeyStrErr cCrushAndSPS arHotKeyStr[i]
vHotKeyWork := vHotKeyWork arHotKeyAsg[i]
}
HotKey %vHotKeyWork%, %varLabelIn%, %cOffHK%, UseErrorLevel ; Включение HotKey
MyErrorLevel := ErrorLevel
If (MyErrorLevel != 0)
{
сHotKeyStrErr := "HotKey" cSps сHotKeyStrErr cComma cSps varLabelIn
If (MyErrorLevel = 1)
Error_TXT := "В параметре Label указано несуществующее имя метки."
If (MyErrorLevel = 2)
Error_TXT := "Дубликат горячих клавиш или они не поддерживаются системой."
If (MyErrorLevel = 3)
Error_TXT := "Неподдерживаемый модификатор горячей клавиши."
If (MyErrorLevel = 4)
Error_TXT := "Клавиши не пригодны для эмуляции AltTab или ShiftAltTab."
If (MyErrorLevel = 5)
Error_TXT := "Команда пытается изменить несуществующую горячую клавишу."
If (MyErrorLevel = 6)
Error_TXT := "Команда пытается изменить несуществующий вариант существующей горячей клавиши."
If (MyErrorLevel = 98)
Error_TXT := "Создание данной горячей клавиши превысило лимит в 700 горячих клавиш."
If (MyErrorLevel = 99)
Error_TXT := "Недостаточно памяти. Ваша OS нестабильна, требуется очистка и настройка."
cTitle := "Ошибка в HotKey" ;Титул MsgBox
cMsgErr := "`n Ошибка в определении - " сHotKeyStrErr
cTxtErrAd1 := "`n`n Тип ошибки :"
cTxtErrAd2 := "`n " Error_TXT
cWait := 35
cTxtErrAd3 := "`n`n Выход из программы(Тайм-аут = " cWait " сек)."
MsgBox % сMsgBoxError_Ok, %cTitle%, %cMsgErr% %cTxtErrAd1% %cTxtErrAd2% %cTxtErrAd3%, %cWait%
Gosub lExitTotalKeys
}
If (varStatusIn)
HotKey %vHotKeyWork%, %varLabelIn%, %cOnHK%, UseErrorLevel
lFnHotkeyExit:
Return vHotKeyWork
}
;-------------------------------------------------------------------------------------------
;------------------------Функция возврата акронима спец. клавиш--------------------------------
fnAssigKey(KeyIn)
{
Local i, iLoop, flg
i := 0, iLoop := 0, flg := False
flg := False ;Флаг акронима
iLoop := arAssigKey.MaxIndex()
i := 0
loop %iLoop%
{
i++
if (arAssigKey[i,iAsKeyName] = KeyIn)
{
flg := True ; Нашли акроним
KeyOut := arAssigKey[i,iAsKeyAcronym], break
}
}
If (flg)
Return KeyOut ; Акроним нашли, возврат не клавиши, а акронима
Else
Return KeyIn ; Акроним не нашли, возврат клавиши, что нам дали на входе
}
;---------------Функция которая убирает пробелы и табуляцию. Возвращает строку сиволов через пробел -------------------
; Если Ar = True то массив, иначе строка
fnParseSPS(buffer, ar := True)
{
local Arr, i, Row, OutStr
Arr := [], j := 0, i := 0, Row := "", OutStr := ""
Loop, parse, buffer, " "
{
Row := RegExReplace(A_LoopField, """| |" A_Tab)
If Row is space
Continue
Arr[++i] := Row
}
If(ar)
;Возврат массива
Return Arr
;Возврат строки - символы через пробел
i := Arr.MaxIndex()
Loop %i%
{
j++
;OutStr := OutStr Arr[j]
If (i != j)
OutStr := OutStr Arr[j] " "
Else
OutStr := OutStr Arr[j]
}
Return OutStr
}
Goto leave_FnAr_KES
;----------------------------------Заглушки--------------------------------------------------
;Для ремаппинга клавиш
lPressKeyToMap:
Return
lSentKeyToMap:
Return
;Просто заглушка
lNoLabel:
Return
;-------------------------------------------------------------------------------------------
leave_FnAr_KES: