Функция _GuiCtrlHotKey_RegisterHotkey

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


_GuiCtrlHotKey_RegisterHotkey

Регистрирует горячую клавишу, и её можно использовать.

#Include <GuiHotKey.au3>
_GuiCtrlHotKey_RegisterHotkey($hWnd, $sID, $sVirtKey, $sModKey)

Параметры

$hWnd Дескриптор окна, которое будет получать сообщения горячих клавиш.
$sID Идентификатор горячей клавиши (1001, 1002 и т.д.)
$sVirtKey Код виртуальной клавиши
$sModKey Флаг модификатора

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

Успех:Возвращает 1
Ошибка:Возвращает 0

Примечания

Не используйте дескриптор временного окна, на котором может быть создан элемент установки горячей клавиши.

Пример

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

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

Global $HotkeyID = 1001, $HotkeyCode, $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()

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

; Регистрация функции обработки горячих клавиш
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
    ; Действие при вызове горячей клавиши, в зависимости от идентификатора
    If BitAND($wParam, 0xFFFF) = $HotkeyID Then WinSetTitle($hGui, '', $iCount & ' раз, Hotkey= ' & _GetKey($HotkeyCode))
    Return $GUI_RUNDEFMSG
EndFunc

Func _Setting() ; окно установки горячих клавиш
    Local $aHotkey, $hGui1, $hHotkey, $iBtnOK, $tmp
    $hGui1 = GUICreate('Установка горячей клавиши', 280, 130, -1, -1, BitOR($WS_CAPTION, $WS_SYSMENU, $WS_POPUP), -1, $hGui)

    GUICtrlCreateLabel('Горячая клавиша: ', 10, 12, 105, 17)
    ; Создание поля ввода для горячих клавиш
    $hHotkey = _GuiCtrlHotKey_Create($hGui1, 115, 10, 110, 20)
    ; установка значений по умолчанию в поле ввода
    _GuiCtrlHotKey_SetHotkey($hHotkey, _WinAPI_LoWord($HotkeyCode), _WinAPI_HiWord($HotkeyCode))

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

                ContinueCase
            Case -3
                ; Удаление объекта поля ввода
                _WinAPI_DestroyWindow($hHotkey)
                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