_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