Функция _GuiCtrlHotKey_Create

         Описание функции


_GuiCtrlHotKey_Create

Создаёт элемент управления HotKey для установки горячей клавиши.

#Include <GuiHotKey.au3>
_GuiCtrlHotKey_Create($hWnd, $sX, $sY[, $sWidth = 100[, $sHeight = 20[, $sStyle = 0]]])

Параметры

$hWnd Дескриптор окна, на котором будет создан элемент
$sX Координата левого края элемента
$sY Координата правого края элемента
$sWidth [необязательный] Ширина элемента
$sHeight [необязательный] Высота элемента
$sStyle [необязательный] Стиль элемента

Возвращаемое значение

Успех:Возвращает дескриптор созданного элемента
Ошибка:Возвращает 0

Примечания

Горячие клавиши устанавливаются в элемент HotKey нажатием горячей клавиши. Элемент не позволяет установить в поле уже используемое сочетание. При нажатии только модификатора (Ctrl, Shift, Alt) поле очищается. Окно, на котором создаётся элемент, может быть временным.

Пример

; rasim
; http://www.autoitscript.com/forum/index.php?showtopic=83224&st=0&p=595204&#entry595204
; Пример установки 8 горячих клавиш, используя массивы

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GuiHotKey.au3>

Global $HotkeyID[9] = [8, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008], $HotkeyCode[9], $iCount

Switch @OSArch
    Case 'X64'
        $HKCU = 'HKCU64'
        $HKCR = 'HKCR64'
    Case Else;'X86'
        $HKCU = 'HKCU'
        $HKCR = 'HKCR'
EndSwitch

$hGui = GUICreate('My Program', 400, 200)
$iButton = GUICtrlCreateButton('Установка горячих клавиш', 100, 10, 200, 28)
$iBtnClear = GUICtrlCreateButton('Очистить сохранение Hotkey в реестре', 90, 80, 220, 28)
GUISetState()

; Установка сохранённых горячих клавиш при старте программы
For $i = 1 To 8
    $HotkeyCode[$i] = RegRead($HKCU & '\Software\MySoft', 'Hotkey' & $i)
    If Not @error And $HotkeyCode[$i] <> '0' Then
        $HotkeyCode[$i] = Number($HotkeyCode[$i])
        If Not _GuiCtrlHotKey_RegisterHotkey($hGui, $HotkeyID[$i], _WinAPI_LoWord($HotkeyCode[$i]), _WinAPI_HiWord($HotkeyCode[$i])) Then
            MsgBox(0, 'Сообщение', 'Не удалось зарегистрировать горячую клавишу ' & _GetKey($HotkeyCode[$i]) & ',' & @LF & _
                    'возможно она используется другим приложением.', 0, $hGui)
            $HotkeyCode[$i] = 0
        EndIf
    Else
        $HotkeyCode[$i] = 0
    EndIf
Next

; Регистрация функции обработки горячих клавиш
GUIRegisterMsg($WM_HOTKEY, "WM_HOTKEY")

While 1
    Switch GUIGetMsg()
        Case $iButton
            _Setting()
        Case $iBtnClear
            RegDelete($HKCU & '\Software\MySoft')
        Case -3
            Exit
    EndSwitch
WEnd

Func WM_HOTKEY($hWnd, $Msg, $wParam, $lParam)
    $iCount += 1
    ; Действие при вызове горячей клавиши, в зависимости от идентификатора
    Switch BitAND($wParam, 0xFFFF)
        Case $HotkeyID[1]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[1]))
        Case $HotkeyID[2]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[2]))
        Case $HotkeyID[3]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[3]))
        Case $HotkeyID[4]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[4]))
        Case $HotkeyID[5]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[5]))
        Case $HotkeyID[6]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[6]))
        Case $HotkeyID[7]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[7]))
        Case $HotkeyID[8]
            WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode[8]))
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc

Func _Setting() ; окно установки горячих клавиш
    Local $aHotkey, $hGui1, $hHotkey, $iBtnOK, $tmp
    Local $f1 = 25, $HotkeyInput[9] = [8]
    $hGui1 = GUICreate('Установка горячих клавиш', 260, 280, -1, -1, BitOR($WS_CAPTION, $WS_SYSMENU, $WS_POPUP), -1, $hGui)

    For $i = 1 To 8
        GUICtrlCreateLabel('Горячая клавиша: ' & $i, 150, $f1 * $i, 290, 17)
        ; Создание поля ввода для горячих клавиш
        $HotkeyInput[$i] = _GuiCtrlHotKey_Create($hGui1, 10, $f1 * $i - 2, 130, 20)
        ; установка значений по умолчанию в поле ввода
        _GuiCtrlHotKey_SetHotkey($HotkeyInput[$i], _WinAPI_LoWord($HotkeyCode[$i]), _WinAPI_HiWord($HotkeyCode[$i]))
    Next

    $iBtnOK = GUICtrlCreateButton('OK', 90, 240, 80, 26)
    GUISetState()
    While 1
        Switch GUIGetMsg()
            Case $iBtnOK ; регистрация горячих клавиш при нажатии кнопки OK
                For $i = 1 To 8
                    $aHotkey = _GuiCtrlHotKey_GetHotkey($HotkeyInput[$i]) ; получить горячую клавишу из поля ввода
                    If IsArray($aHotkey) Then
                        $tmp = _WinAPI_MakeLong($aHotkey[0], $aHotkey[1])
                        If $HotkeyCode[$i] <> $tmp Then ; если горячая клавиша изменилась, то регистрируем её
                            ; Если регистрация прошла успешно, то
                            If _GuiCtrlHotKey_RegisterHotkey($hGui, $HotkeyID[$i], $aHotkey[0], $aHotkey[1]) Then
                                $HotkeyCode[$i] = $tmp ; обновляет код клавиши
                                ; И сохраняет в реестре
                                RegWrite($HKCU & '\Software\MySoft', 'Hotkey' & $i, 'REG_SZ', $HotkeyCode[$i])
                            Else
                                MsgBox(0, 'Сообщение', 'Не удалось зарегистрировать горячую клавишу' & _GetKey($tmp) & ',' & @LF & _
                                        'возможно она используется другим приложением.', 0, $hGui1)
                                $HotkeyCode[$i] = 0
                            EndIf
                        EndIf
                    Else ; если горячая клавиша сброшена/отменена, то разрегистрируем горячую клавишу
                        _GuiCtrlHotKey_UnregisterHotkey($hGui, $HotkeyID[$i])
                        RegWrite($HKCU & '\Software\MySoft', 'Hotkey' & $i, 'REG_SZ', '0')
                        $HotkeyCode[$i] = 0
                    EndIf
                Next

                ContinueCase
            Case -3
                For $i = 1 To 8
                    ; Удаление объектов полей ввода
                    _WinAPI_DestroyWindow($HotkeyInput[$i])
                Next
                GUISetState(@SW_ENABLE, $hGui)
                GUIDelete($hGui1)
                ExitLoop
        EndSwitch
    WEnd
EndFunc

; Получает текстовое значение горячей клавиши из кода
Func _GetKey($HotkeyCode)
    Local $HiW, $Key
    $HiW = _WinAPI_HiWord($HotkeyCode)
   
    If BitAND($HiW, $HOTKEYF_CONTROL) Then $Key &= ' + Ctrl'
    If BitAND($HiW, $HOTKEYF_SHIFT) Then $Key &= ' + Shift'
    If BitAND($HiW, $HOTKEYF_ALT) Then $Key &= ' + Alt'
   
    $Key &= ' + ' & Chr(_WinAPI_LoWord($HotkeyCode))
    $Key = StringTrimLeft($Key, 3)
   
    Return $Key
EndFunc