Jump to content

Recommended Posts

Posted (edited)

; #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)

To read from an ini-file

Edited by AZJIO
Posted

Never crossed my mind to create something like this. Thanks AZJIO.

UDF List:

  Reveal hidden contents

Updated: 22/04/2018

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...