_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