_HotKeyString_To_AutoitCode

Recommended Posts

```; #FUNCTION# ;=================================================================================
; Function Name ...: _HotKeyString_To_AutoitCode
; Description ........: Converts text format recording hotkey to format HotKeySet in Autoit3
; Syntax................: _HotKeyString_To_AutoitCode ( \$sKey )
; Parameters:
;       \$sKey - text format recording hot key, such as "Ctrl + s"
; Return values ....: Success - Returns a string in the format function in HotKeySet Autoit3, such as "^s"
;                   Failure - empty string, @error:
;                  |1 - empty string
;                  |2 - with modifiers used in more than one key
;                  |3 - the same modifier is used more than once
; Author(s) ..........: AZJIO
; Remarks ..........:
; ============================================================================================
Func _HotKeyString_To_AutoitCode(\$sKey)
Local \$ch, \$k
If \$sKey = '' Then Return SetError(1, 0, '')
\$sKey = '{' & StringRegExpReplace(StringStripWS(\$sKey, 8), '(?<!\+)\+', '}{') & '}' ; удаляем пробелы, используем "+" как разделитель
If StringRight(\$sKey, 3) = '}{}' Then \$sKey = StringTrimRight(\$sKey, 2) ; если заканчивается разделителем справа, вместо клавиши
If StringLeft(\$sKey, 3) = '{}{' Then \$sKey = StringTrimLeft(\$sKey, 2) ; если заканчивается разделителем слева, вместо клавиши
\$sKey = StringRegExpReplace(\$sKey, '\{([^!+^#{}])\}', '\1') ; если не метасимволы то убираем обрамляющие фигурные скобки

; Создаёт строку модификаторов
Local \$sMod = ''
Local \$aMod = StringRegExp(\$sKey, '(\{(?:Alt|Shift|Ctrl|Win)\})', 3) ; извлекает модификаторы
If Not @error Then
For \$i = 0 To UBound(\$aMod) - 1
\$sMod &= \$aMod[\$i]
Next
\$sMod = StringReplace(\$sMod, '{Alt}', '!')
If @extended > 1 Then Return SetError(3, 0, '')
\$sMod = StringReplace(\$sMod, '{Shift}', '+')
If @extended > 1 Then Return SetError(3, 0, '')
\$sMod = StringReplace(\$sMod, '{Ctrl}', '^')
If @extended > 1 Then Return SetError(3, 0, '')
\$sMod = StringReplace(\$sMod, '{Win}', '#')
If @extended > 1 Then Return SetError(3, 0, '')
EndIf
; проверка наличие только одной клавиши в сочетании с модификаторами
\$sKey = StringRegExpReplace(\$sKey, '\{Alt\}|\{Shift\}|\{Ctrl\}|\{Win\}', '') ; удаляем модификаторы
\$ch = StringRegExpReplace(\$sKey, '\{.*?\}', '') ; подсчитываем элементы обрамлённые фигурными скобками
\$k = @extended
\$k += StringLen(\$ch) ; добавляем количество символов без фигурных скобок
If \$k <> 1 Then Return SetError(2, 0, '') ; возвращает пустую строку при ошибке
Return \$sMod & \$sKey
EndFunc   ;==>_HotKeyString_To_AutoitCode```

example

```#include <_HotKeyString_To_AutoitCode.au3>
\$sHotKey = _HotKeyString_To_AutoitCode('Ctrl + s') & @LF
\$sHotKey &= _HotKeyString_To_AutoitCode('Ctrl + Alt+ F1') & @LF
\$sHotKey &= _HotKeyString_To_AutoitCode('Ctrl + Shift+ +') & @LF
\$sHotKey &= _HotKeyString_To_AutoitCode('Win + Home')
MsgBox(0, 'Yes?', \$sHotKey)

; error
\$sHotKey = _HotKeyString_To_AutoitCode(' + Shift') & @LF ; excess divider
\$sHotKey &= _HotKeyString_To_AutoitCode('Ctrl + Shift+ ') & @LF ; excess divider
\$sHotKey &= _HotKeyString_To_AutoitCode(' + Shift+ ') & @LF ; excess divider
\$sHotKey &= _HotKeyString_To_AutoitCode(' Ctrl + Shift') & @LF ; only modifiers
\$sHotKey &= _HotKeyString_To_AutoitCode(' Ctrl + d+Shift') & @LF ; non-compliance with order
\$sHotKey &= _HotKeyString_To_AutoitCode('Ctrl + s + d') ; more than one key with the modifier
MsgBox(0, 'Faulty', \$sHotKey)```

Edited by AZJIO
• 2

Share on other sites

Thank you for reminding me about

`#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7`

I forgot to make a local variable. Fixed

Share on other sites

This has been done a couple of times before (though I don't think any were as neat as this one). I did one for >this, and I think Achilles had a similar thing before that (can't find the link though).

Create an account

Register a new account