Das Demo-Skript zeigt wie man einen Benutzer eine beliebige HotKey Kombination auswählen lassen kann.
Gebraucht habe ich das für ein eigenes Programm - ich fand es schlicht unschön dort den Benutzer {F12} eingeben zu lassen,
eine ComboBox fand ich ebenfalls "uncool".
Ich habe in dem Skript eingeschränkt, das für einen HotKey mindestens eine der Tasten STRG, ALT oder WIN gedrückt sein muss.
Zusätzlich kann der Benutzer die SHIFT Taste drücken sowie eine "frei" wählbare Taste.
Leider habe ich für SetHotKey() nicht für alle Tasten ein Gegenstück gefunden (mit _IsPressed lässt sich mehr abfragen)
Verbesserungsvorschläge, insbesondere Vereinfachungen werden gerne angenommen!
Edit1 vom 17.11.2011:
- _GetKeyCombination() gemäß Vorschlag von BugFix stark verkürzt
- StringRegReplace Pattern verkürzt, unnötige Klammern entfernt
- Rechschreibfehler korregiert
Edit2 vom 17.11.2011:
- Kommentare angepasst im Skript
- Auch das Skript zum herunterladen aktualisiert
Edit3 vom 17.11.2011:
- Zeile 191 überarbeitet - der Benutzer konnte doch nur eine einzelne Taste ohne STRG, ALT oder WIN belegen da nicht darauf geprüft wurde
Hier der Code, ich habe mich um reichlich Kommentare bemüht:
#Region ;************ Includes ************
;~ #include <GUIConstants.au3>;~~~
#include <Misc.au3>
;~ #include <Array.au3>;~~~
;~ #include <ButtonConstants.au3>;~~~
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
;~ #include <StaticConstants.au3>;~~~
;~ #include <WindowsConstants.au3>;~~~
#EndRegion ;************ Includes ************
; 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
Alles anzeigen
BLinz