#include <GUIConstants.au3>
#include <Misc.au3>
#include <Array.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

; HotKey Frei-Wählen-Setup-Demo
; Demo für Demonstration wie man einen Benutzer einen HotKey für einen Aufgabe frei wählen lässt.
; 16.11.2011 von Bernhard Linz (BLinz) für www.autoit.de

Global $sPressedKeys     ; enthält später die gleichzeitig gedrückten tasen zur Auswertung
Global $sHotKeyLabel     ; Der Text der oben in der GUI Angezeigt werden soll
Global $sHotKeyString    ; Der String für den Befehl HotKeySet
Global $bKeyALT          ; Status der ALT Taste wird hier abgelegt
Global $bKeySTRG         ; Status der Steuerungstaste wird hier abgelegt
Global $bKeySHIFT        ; Status der SHIFT Taste wird hier abgelegt
Global $bKeyWIN = False

;Nachfolgend ein Array mit den möglichen Tasten (wobei wir einige später herausfiltern, aber die Liste sollte möglichst Komplett sein)
; 4 Felder:  Feld1 = HexCode Taste, Feld2 = Englische Beschreibung, Feld3 = Deutsche Beschreibung, Feld4 = String wie ihn SetHotKey benötigt
; wenn das 4. Feld leer ist hatte ich keine Taste für SetHotKey gefunden
Global $aKeylist_with_Description[108][4] = [ _
		["01","Left mouse button","Linke Maustaste",""], _
		["02","Right mouse button","Rechte Maustaste = F12",""], _
		["04","Middle mouse button (three-button mouse)","Mittlere Maustaste = F12",""], _
		["05","Windows 2000/XP: X1 mouse button","X1 Maus-Taste = F12",""], _
		["06","Windows 2000/XP: X2 mouse button","X2 Maus-Taste = F12",""], _
		["08","BACKSPACE key","Löschtaste rückwärts","{BACKSPACE}"], _
		["09","TAB key","Tabulator-Taste","{TAB}"], _
		["0C","CLEAR key","Entf-Taste","{DEL}"], _
		["0D","ENTER key","Enter/Return-Taste","{ENTER}"], _
		["10","SHIFT key","Shift/Umschalt/'Großschreib'-Taste",""], _
		["11","CTRL key","Ctrl/Strg-Taste",""], _
		["12","ALT key","Alt-Taste",""], _
		["13","PAUSE key","Pause-Taste","{PAUSE}"], _
		["14","CAPS LOCK key","Feststelltaste","{CAPSLOCK toggle}"], _
		["1B","ESC key","Esc-Taste","{ESC}"], _
		["20","SPACEBAR","Leertaste","{SPACE}"], _
		["21","PAGE UP key","Bild-auf Taste","{PGUP}"], _
		["22","PAGE DOWN key","Bild-ab Taste","{PGDN}"], _
		["23","END key","Ende-Taste","{END}"], _
		["24","HOME key","Pos 1-Taste","{HOME}"], _
		["25","LEFT ARROW key","Pfeiltaste nach links","{LEFT}"], _
		["26","UP ARROW key","Pfeiltaste nach oben","{UP}"], _
		["27","RIGHT ARROW key","Pfeiltaste nach rechts","{RIGHT}"], _
		["28","DOWN ARROW key","Pfeiltaste nach unten","{DOWN}"], _
		["29","SELECT key","Auswahltaste",""], _
		["2A","PRINT key","Drucktaste","{PRINTSCREEN}"], _
		["2B","EXECUTE key","Ausführentaste",""], _
		["2C","PRINT SCREEN key","Drucktaste","{PRINTSCREEN}"], _
		["2D","INS key","Einfg-Taste","{INS}"], _
		["2E","DEL key","Entf-Taste","{DEL}"], _
		["30","0","0","0"], _
		["31","1","1","1"], _
		["32","2","2","2"], _
		["33","3","3","3"], _
		["34","4","4","4"], _
		["35","5","5","5"], _
		["36","6","6","6"], _
		["37","7","7","7"], _
		["38","8","8","8"], _
		["39","9","9","9"], _
		["41","A","A","a"], _
		["42","B","B","b"], _
		["43","C","C","c"], _
		["44","D","D","d"], _
		["45","E","E","e"], _
		["46","F","F","f"], _
		["47","G","G","g"], _
		["48","H","H","h"], _
		["49","I","I","i"], _
		["4A","J","J","j"], _
		["4B","K","K","k"], _
		["4C","L","L","l"], _
		["4D","M","M","m"], _
		["4E","N","N","n"], _
		["4F","O","O","o"], _
		["50","P","P","p"], _
		["51","Q","Q","q"], _
		["52","R","R","r"], _
		["53","S","S","s"], _
		["54","T","T","t"], _
		["55","U","U","u"], _
		["56","V","V","v"], _
		["57","W","W","w"], _
		["58","X","X","x"], _
		["59","Y","Y","y"], _
		["5A","Z","Z","z"], _
		["5B","Left Windows key","Linke Windows-Taste",""], _
		["5C","Right Windows key","Rechte Windows-Taste",""], _
		["60","Numeric keypad 0 key","rechter Nummerblock Taste 0","{NUMPAD0}"], _
		["61","Numeric keypad 1 key","rechter Nummerblock Taste 1","{NUMPAD1}"], _
		["62","Numeric keypad 2 key","rechter Nummerblock Taste 2","{NUMPAD2}"], _
		["63","Numeric keypad 3 key","rechter Nummerblock Taste 3","{NUMPAD3}"], _
		["64","Numeric keypad 4 key","rechter Nummerblock Taste 4","{NUMPAD4}"], _
		["65","Numeric keypad 5 key","rechter Nummerblock Taste 5","{NUMPAD5}"], _
		["66","Numeric keypad 6 key","rechter Nummerblock Taste 6","{NUMPAD6}"], _
		["67","Numeric keypad 7 key","rechter Nummerblock Taste 7","{NUMPAD7}"], _
		["68","Numeric keypad 8 key","rechter Nummerblock Taste 8","{NUMPAD8}"], _
		["69","Numeric keypad 9 key","rechter Nummerblock Taste 9","{NUMPAD9}"], _
		["6A","Multiply key","rechter Nummerblock Malzeichen","{NUMPADMULT}"], _
		["6B","Add key","rechter Nummerblock Pluszeichen","{NUMPADADD}"], _
		["6C","Separator key","rechter Nummernblock Eingabetaste","{NUMPADENTER}"], _
		["6D","Subtract key","rechter Nummerblock Minuszeichen","{NUMPADSUB}"], _
		["6E","Decimal key","rechter Nummerblock Kommazeichen","{NUMPADDOT}"], _
		["6F","Divide key","rechter Nummerblock Geteiltzeichen","{NUMPADDIV}"], _
		["70","F1","F1","{F1}"], _
		["71","F2","F2","{F2}"], _
		["72","F3","F3","{F3}"], _
		["73","F4","F4","{F4}"], _
		["74","F5","F5","{F5}"], _
		["75","F6","F6","{F6}"], _
		["76","F7","F7","{F7}"], _
		["77","F8","F8","{F8}"], _
		["78","F9","F9","{F9}"], _
		["79","F10","F10","{F10}"], _
		["7A","F11","F11","{F11}"], _
		["7B","F12","F12","{F12}"], _
		["7C","F13","F13","{F13}"], _
		["7D","F14","F14","{F14}"], _
		["7E","F15","F15","{F15}"], _
		["7F","F16","F16","{F16}"], _
		["90","NUM LOCK key","Num-Taste","{NUMLOCK toggle}"], _
		["91","SCROLL LOCK key","Rollen-Taste","{SCROLLLOCK toggle}"], _
		["A0","Left SHIFT key","linke Shift/Umschalt/Feststelltaste",""], _
		["A1","Right SHIFT key","rechte Shift/Umschalt/Feststelltaste",""], _
		["A2","Left CONTROL key","linke Ctrl/Strg-Taste",""], _
		["A3","Right CONTROL key","rechte Ctrl/Strg-Taste",""], _
		["A4","Left MENU key","(linke) Alt-Taste",""], _
		["A5","Right MENU key","(rechte) Alt Gr-Taste",""] ]


; Die GUI
#Region ### START Koda GUI section ### Form=C:\_AutoIT\HotKey Setup\FormHotKeyTest.kxf
$FormHotKeyTest = GUICreate("HotKey Setup Demo - 2011 von BLinz", 611, 266, 607, 124)
$ButtonHotkeybelegen = GUICtrlCreateButton("Hotkey belegen", 8, 208, 593, 49)
GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")
$InputStatus = GUICtrlCreateInput("Bereit ....", 8, 168, 593, 32, BitOR($GUI_SS_DEFAULT_INPUT,$ES_READONLY))
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
$Group1 = GUICtrlCreateGroup(" Hotkey ist ", 8, 8, 593, 49)
$LabelHokey = GUICtrlCreateLabel("", 16, 24, 574, 26)
GUICtrlSetFont(-1, 14, 800, 0, "Courier New")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$LabelAnleitung = GUICtrlCreateLabel("Anleitung:", 16, 72, 51, 17)
$LabelAnleitungText1 = GUICtrlCreateLabel("Zuerst alle Zusatztasten wie ALT, STRG, SHIFT oder WIN drücken - und dann die Zusatztaste, z.B. F12", 80, 72, 497, 17)
$LabelAnleitungText2 = GUICtrlCreateLabel("Nach erfolgreicher Belegung steht die gewählte Kombination oben im -=> Hotkey ist <=- Feld", 80, 120, 438, 17)
$LabelAnleitungText3 = GUICtrlCreateLabel("Danach kann der Hotkey getestet werden - es erscheint dann eine Message Box.", 80, 144, 389, 17)
$LabelAnleitungText4 = GUICtrlCreateLabel("Es muss mindestens eine der Tasten ALT, STRG oder WIN gedrückt werden!", 80, 96, 370, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###



; Die Hauptschleife für die Abfrage der GUI
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE
			; Das rote X oben rechts - und Tschüss!
            Exit
		Case $ButtonHotkeybelegen
			; Der Anwender will einen HotKey belegen!
			GUICtrlSetState($ButtonHotkeybelegen, $GUI_DISABLE) ; den Button ausgrauen damit der Benutzer sieht das der Abfragemodus aktiv ist
			; Variablen wieder auf Ausgangsposition bringen - falls der Anwender das ganze mehrmals aufruft
			$sHotKeyLabel = ""
			$sHotKeyString = ""
			$bKeyALT = False
			$bKeySTRG = False
			$bKeySHIFT = False
			$bKeyWIN = False
			; Benutzer Informieren das es los geht:
			GUICtrlSetData($LabelHokey, "Bitte Tastenkombination drücken!")

			; In der folgenden Schleife fragen wir die Tasten ab mit der Funktion _GetKeyCombination()
			While 1
				$sPressedKeys = _GetKeyCombination()
				;prüfen ob eine der Haupttasten gedrückt wurde
				If StringInStr($sPressedKeys,"10") > 0 Then $bKeySHIFT = True
				If StringInStr($sPressedKeys,"11") > 0 Then $bKeySTRG = True
				If StringInStr($sPressedKeys,"12") > 0 Then $bKeyALT = True
				If StringInStr($sPressedKeys,"5B") > 0 Then $bKeyWIN = True
				;Info-Anzeige füllen
				GUICtrlSetData($InputStatus, $sPressedKeys)
				;Nachfolgende Zeile schmeisst alle bösen Tasten aus dem String,
				;Böse Tasten sind die Haupttasten sowie die Nebenergebnisse (z.B. 10 für Shift und A0 dafür das es die linke war)
				$sPressedKeys = StringRegExpReplace($sPressedKeys,"(?i)\s|1[012]|A[012345]|5[BCD]","")
				;Wenn jetzt noch eine Taste übrig ist, haben wir unsere Tastenkombination (=mindestens ALT oder STRG oder WIN + eine Taste)
				If $bKeyALT = True Or $bKeySTRG = True Or $bKeyWIN = True And StringLen($sPressedKeys) > 0 Then ExitLoop
			WEnd

			;Nun den Text für die Anzeige und den String für den Befehl SetHotKey zusammenbauen
			If $bKeySTRG = True Then
				$sHotKeyLabel = $sHotKeyLabel & "[STRG] + " ; für die Anzeige
				$sHotKeyString = $sHotKeyString & "^" ; für HotKeySet (siehe Hilfe)
			EndIf
			If $bKeyALT = True Then
				$sHotKeyLabel = $sHotKeyLabel & "[ALT] + "
				$sHotKeyString = $sHotKeyString & "!"
			EndIf
			If $bKeySHIFT = True Then
				$sHotKeyLabel = $sHotKeyLabel & "[SHIFT] + "
				$sHotKeyString = $sHotKeyString & "+"
			EndIf
			If $bKeyWIN = True Then
				$sHotKeyLabel = $sHotKeyLabel & "[WIN] + "
				$sHotKeyString = $sHotKeyString & "#"
			EndIf
			; Jetzt noch die Taste dazu (z.B. F12), die suchen wir nun im Array
			For $i = 0 To UBound($aKeylist_with_Description) - 1
				If $aKeylist_with_Description[$i][0] = $sPressedKeys Then
					$sHotKeyLabel = $sHotKeyLabel & $aKeylist_with_Description[$i][2] ; den deutschen Text [2] anhängen
					If $aKeylist_with_Description[$i][3] <> "" Then ; es gab Tasten die zwar abgefragt aber nicht als HotKey gesetzt werden können (die haben "")
						$sHotKeyString = $sHotKeyString & $aKeylist_with_Description[$i][3] ;den String für SetHotKey weiter zusammenbauen
						HotKeySet($sHotKeyString,"_HotKeyFunktionTest") ; Hotkey setzen
						GUICtrlSetData($InputStatus,"Bereit für Test!") ; Lieber Anwender, es hat geklappt
					Else
						MsgBox(16,"FEHLER","Zeichen wurde nicht im Array gefunden!") ; diese Taste kann nicht mit SetHotKey gesetzt werden
						GUICtrlSetData($InputStatus,"Fehler! Hotkey noch einmal setzten!") ; Lieber Anwender, es hat nicht geklappt
					EndIf
				EndIf
			Next
			GUICtrlSetData($LabelHokey, $sHotKeyLabel) ; Anwender über die erkannte Tastenkombination informieren
			GUICtrlSetState($ButtonHotkeybelegen, $GUI_ENABLE) ; und Schaltfäche wieder aktivieren
    EndSwitch
WEnd


; Nachfolgende Funktion stammt von BugFix, www.autoit.de

Func _GetKeyCombination()
    Local $sReturnstring
    For $i = 0 To 255
        If _IsPressed(Hex($i, 2)) Then $sReturnstring &= Hex($i, 2) & ' '
    Next
    Return StringTrimRight($sReturnstring, 1)
EndFunc   ;==>_GetKeyCombination

; Und die Funktion für den Test des HotKeys
Func _HotKeyFunktionTest()
	MsgBox(0,"Hinweis","Diese Message Box wurde per Hotkey aufgerufen!")
EndFunc
