; 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