; 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