Key( ) - Tastatur- und Maustastenabfrage incl. Repeat und Doppelklick

  • Hallo liebe AutoIt-Gemeinde,

    ich bin ganz neu hier im Forum und schreibe jetzt seit ca. 4 Monaten mit Begeisterung kleinere und z.T. auch größere AutoIt-Skripte. Nicht alles davon ist schon fertig, aber hier möchte ich endlich schon mal ein nützliches Tool von mir vorstellen.

    Den UDF-Befehl _IsPresed (aus der Misc.au3) finde ich sehr umständlich und unbefriedigend und so habe ich einen eigenen Befehl geschrieben:

    Key( $Tastenname, $Repeatmethode, $Delay)

    Damit lassen sich alle Tasten und Maustasten z.B. beim Namen abfragen, z.B.:

    While Not Key("ESC") 
    .....
    Wend

    das versteht doch jeder auf einem Blick. Außerdem habe ich dem Nutzer des Key-Befehls sehr viel Freiheit gelassen. Statt dem Schlüsselwort "ESC" könnte man z.B. auch "ESCAPE" schreiben. Eine genaue Liste aller Schlüsselwörter findest Du hier:

    Spoiler anzeigen

    ;*******************************************
    ;* *
    ;* Beispiel zum Befehl Key() *
    ;* *
    ;*******************************************
    ;Autor: Deep Thought (http://www.autoit.de/)
    ;Syntax: Key($Tastenname, $Repeatmethode, $Delay)


    Es gelten die gleichen Schlüsselwörter, wie beim Send()-Befehl. Daneben sind folgende Schlüsselwortvarianten erlaubt:


    ==============================================================
    A-Z, 0-9, F1-F16
    ==============================================================


    ==============================================================
    Maustasten
    ==============================================================
    "LMAUS", "L Maus", "LINKE MAUS", "MAUS L", "MAUS LINKS"

    "RMAUS", "R MAUS", "RECHTE MAUS", "MAUS R, "MAUS RECHTS"

    "MMAUS", "M MAUS", "MITTLERE MAUS", "MAUS M", "MAUS MITTE"

    "1MAUS", "X1MAUS", "X1 MAUS", "MAUS X1"

    "2MAUS", "X2MAUS", "X2 MAUS", "MAUS X2"


    ==============================================================
    Shift, Strg, Alt, Win
    ==============================================================
    "LSHIFT", "L SHIFT", "SHIFT L", "SHIFT LINKS", "LINKE SHIFT"

    "RSHIFT", "R SHIFT", "SHIFT R", "SHIFT RECHTS", "RECHTE SHIFT"

    "LCTRL", "L CTRL", "CTRL L", "CTRL LINKS", "LINKE CTRL", "LSTRG", "L STRG", "STRG L", "STRG LINKS", "LINKE STRG"

    "RCTRL", "R CTRL", "CTRL R", "CTRL RECHTS", "RECHTE CTRL", "RSTRG", "R STRG", "STRG R", "STRG RECHTS", "RECHTE STRG"

    "LALT", "L ALT", "ALT L", "ALT LINKS", "LINKE ALT"

    "RALT", "R ALT", "ALT R", "ALT RECHTS", "RECHTE ALT", "ALTGR", "ALT GR"

    "LWIN", "L WIN", "LWINDOWS", "L WINDOWS", "WIN L", "WIN LINKS", "WINDOWS L", "WINDOWS LINKS", "LINKE WIN", "LINKE WINDOWS"

    "RWIN", "R WIN", "RWINDOWS", "R WINDOWS", "WIN R", "WIN RECHTS", "WINDOWS R", "WINDOWS RECHTS", "RECHTE WIN", "RECHTS WINDOWS"

    "SHIFT" ; egal ob li/re

    "CTRL", "STRG" ; egal ob li/re

    "ALT" ; egal ob li/re

    "WIN", "WINDOWS" ; egal ob li/re


    ==============================================================
    Cursor, Seite
    ==============================================================
    "LEFT", "CURSOR LEFT", "CURSOR LINKS", "LINKS"

    "RIGHT", "CURSOR RIGHT", "CURSOR RECHTS", "RECHTS"

    "UP", "CURSOR UP", "CURSOR HOCH", "CURSOR RAUF", "HOCH", "RAUF"

    "DOWN", "CURSOR DOWN", "CURSOR RUNTER", "RUNTER"

    "HOME", "POS1", "POS 1"

    "END", "ENDE"

    "PGUP", "PG UP", "PAGEUP", "PAGE UP", "BILD HOCH", "BILD RAUF", "SEITE HOCH", "SEITE RAUF"

    "PGDN", "PG DN", "PGDOWN", "PG DOWN", "PAGEDOWN", "PAGE DOWN", "BILD RUNTER", "SEITE RUNTER"


    ==============================================================
    Zehner-Tastatur
    ==============================================================
    "NUMPAD*", "NUMPAD *", "NUMPADMULT"

    "NUMPAD+", "NUMPAD +", "NUMPADADD"

    "NUMPAD-", "NUMPAD -", "NUMPADSUB"

    "NUMPAD,", "NUMPAD ,", "NUMPAD KOMMA", "NUMPADDOT"

    "NUMPAD:", "NUMPAD :", "NUMPADDIV"


    ==============================================================
    sonstige Zeichen
    ==============================================================
    ",", ";", "KOMMA"

    "-", "_"

    ".", ":", "PUNKT"

    "ß", "?", "\"

    "°", "^"

    "´", "`"

    "<", ">", "|"

    " ", "SPACE"


    ==============================================================
    sonstige Steuerung
    ==============================================================
    "BS", "BACKSPACE"

    "TAB", "TABULATOR"

    "RETURN", "ENTER"

    "PAUSE"

    "CAPSLOCK", "CAPSLOCK toggle"

    "ESC", "ESCAPE"

    "DRUCK", "DRUCKEN", "PRINTSCREEN", "PRINT SCREEN"

    "INS", "INSERT", "EINFG", "EINFÜGEN"

    "DEL", "DELETE", "ENTF", "ENTFERNEN"

    "KONTEXT", "Context", "APPSKEY"

    "NUM", "NUMLOCK", "NUMLOCK toggle"

    "ROLLEN", "SCROLLLOCK", "SCROLLLOCK toggle"

    Eine kleine Besonderheit ist, daß Du auch ganz komfortabel Tastenwiederholungen (incl. einer beliebig definierten Anschlag-Wiederholverzögerung) abfragen kannst, d.h. z.B. mit
    $a=Key(Default,-180,700) fragst Du ab, ob irgend eine beliebige Taste (deshalb Default) gedrückt wird, und wenn die Taste länger als 700 ms gedrückt bleibt, dann wird die Taste alle 180 ms als gedrückt wiedererkannt.
    Auf ähnliche Weise werden auch Doppelklicks von normalen Klicks unterschiedlich erkannt. Das ganze wird noch abgerundet, indem du alternativ auch mit dem Hex-Code zu jeder Taste wie bei _IsPresed arbeiten kannst. Damit kann man dann z.B. abfragen, ob eine Taste in einem bestimmten Bereich, z.B. 0x61 bis 0x7A gedrückt wurde.

    Und hier jetzt meine UDF:

    Spoiler anzeigen
    [autoit]

    ;************************************************************************************************************
    ;* *
    ;* *
    ;* Key() *
    ;* ===== *
    ;* *
    ;* Version 1 *
    ;* Autor: Deep Thought (http://www.autoit.de) *
    ;* Syntax: Key( $Tastenname, [$Repeatmethode, [$Delay]] ) *
    ;* *
    ;* Abfrage, ob eine (bestimmte) (Maus-)Taste gedrückt wird. *
    ;* (Komfortable Alternative zum UDF-Befehl _IsPreset aus der Include-Datei <Misc.au3>) *
    ;* *
    ;* *
    ;* *
    ;* PARAMETER: *
    ;* ========== *
    ;* *
    ;* $NAME z.B. ("LSHIFT") => - Tastenname, fragt ab, ob eine bestimmte Taste gedrückt wird, *
    ;* z.B. die linke Umschalttaste *
    ;* *
    ;* - dabei sind zahllose Bezeichnungsvarianten möglich z.B.: *
    ;* "LSHIFT", "L SHIFT", "SHIFT L", "SHIFT LINKS", "LINKE SHIFT" *
    ;* *
    ;* - ob Groß-/Kleinschreibung spielt keine Rolle *
    ;* *
    ;* - Besonderheit bei SHIFT, CTRL, ALT und WIN: wenn z.B. nur "ALT" *
    ;* angegeben wird, dann ist es egal, ob die linke oder rechte Taste *
    ;* *
    ;* RÜCKGABEWERT: TRUE / FALSE *
    ;* ============= *
    ;* *
    ;* *
    ;* ("") => - überprüft, ob z.Zt. keine Taste gedrückt wird *
    ;* *
    ;* RÜCKGABEWERT: TRUE (=keine Taste)/ FALSE *
    ;* ============= *
    ;* *
    ;* *
    ;* ("HEX") => - gibt die aktuelle Taste als Hex-Zahl wieder *
    ;* *
    ;* RÜCKGABEWERT: zweistellige Hex-Zahl ("00", wenn keine Taste) *
    ;* ============= *
    ;* *
    ;* *
    ;* () => - gibt die aktuelle Taste als Tastennamen wieder (Bezeichnung ist *
    ;* identisch wie beim Send()-Befehl) *
    ;* *
    ;* RÜCKGABEWERT: z.B. "HOME", "PGDN" oder "NUMPAD3" *
    ;* ============= *
    ;* *
    ;* *
    ;* $Repeat (False)oder () => - Kein Repeat. RÜCKGABEWERT nur, in dem Moment wo Taste gedrückt wird*
    ;* *
    ;* *
    ;* ("Loslassen") => - Wie False, jedoch RÜCKGABEWERT nur im Moment des Taste loslassens *
    ;* *
    ;* *
    ;* ("Standard") => - Anschlag-Wiederholverzögerung = 800 Milisekunden *
    ;* - Wiederholgeschwindigkeit alle 200 Milisekunden *
    ;* *
    ;* *
    ;* (>0) => - Wiederholgeschwindigkeit in Milisekunden *
    ;* - keine Anschlag-Wiederholverzögerung, Repeat fängt sofort an *
    ;* *
    ;* *
    ;* (<0) => - Wiederholgeschwindigkeit in Milisekunden *
    ;* - mit Anschlag-Wiederholverzögerung (siehe auch $Delay) *
    ;* *
    ;* *
    ;* ("Doppelklick") => - Es wird überprüft, ob eine Taste in einem definierten Zeitrahmen *
    ;* (siehe $Delay) nur einmal oder doppelt angeklickt wurde *
    ;* *
    ;* RÜCKGABEWERT: z.B. "HOME" (ohne Doppelklick) *
    ;* ============= oder "Doppelklick HOME" (mit Doppelklick) *
    ;* *
    ;* *
    ;* $Delay (>=0) => - Bei Repeat: Anschlag-Wiederholverzögerung in Milisekunden *
    ;* *
    ;* - Bei Doppelklick: max. Gültigkeitsbereich zwischen 2 Klicks (in msek) *
    ;* *
    ;* *
    ;* (Default) / () => - Bei Repeat: 800 msek Anschlag-Wiederholverzögerung *
    ;* *
    ;* - Bei Doppelklick: 500 msek Gültigkeit zwischen 2 Klicks *
    ;* *
    ;* *
    ;************************************************************************************************************
    #Region Includes und Globale Variabeln
    #include-once
    #include <Misc.au3>
    Global $User32DLL
    ; Variabeln, die sich der Befehl "Key()" für den nächsten Aufruf merkt
    Global $AHUDFsKey_Merken_Akt = False ; welche Taste (bzw. keine Taste) beim letzten mal
    Global $AHUDFsKey_Merken_Repeatzeit = False ; Repeat
    Global $AHUDFsKey_Merken_Anschlagbeginn ; wichtig für Repeat oder "Doppelklick"
    Global $AHUDFsKey_Merken_AnzKlicks = 0 ; wichtig für "Doppelklick"
    Global $AHUDFsKey_Merken_SelbeTaste = False ; wichtig für "Doppelklick"
    Global $AHUDFsKey_Merken_Akt2
    #EndRegion
    ; _
    Func Key($Name=Default,$Repeat=False,$Delay=Default)
    Local $Debug = False ; Zum testen dieser Funktion
    ; Standardwerte bei bestimmten Modi zuordnen
    Switch $Repeat
    Case "Standard"
    $Repeat = -200
    $Delay = 800
    Case "Doppelklick"
    If $Delay = Default then $Delay = 500 ; in diesem Fall die max. Verzögerung zwischen zwei Tastenklicks
    Case Else
    If $Delay = Default then $Delay = 800
    EndSwitch
    ; Aktuelle Taste abfragen und überprüfen, ob sich was seit der letzten Abfrage geändert hat
    Local $Aktuell = AHUDFKey_WelcheTaste($Name)
    Local $Anders = Not(($AHUDFsKey_Merken_Akt = $Aktuell))
    ; Standard-Rückgabewert ermitteln, wenn keine Taste gedrückt ist
    Switch $Name ; erwarteter Rückgabewert je nach Abfragemethode
    Case Default ; ()
    Local $KeineTaste = False
    Case "HEX" ; ("HEX")
    Local $KeineTaste = "00"
    Case "" ; ("")
    Local $KeineTaste = True
    Case Else ; konkrete Tastenabfragen
    Local $KeineTaste = False
    EndSwitch
    ; ### Debug
    If $Debug Then ToolTip("Name: "&$Name&@CRLF&"RepeatMode: "&$Repeat&@CRLF&"KeineTaste: "&$KeineTaste&@CRLF&@CRLF&"Aktuell: "&$Aktuell&@CRLF&"Anders: "&$Anders&@CRLF&@CRLF&"MerkenAkt: "&$AHUDFsKey_Merken_Akt&@CRLF&"MerkenTime: "&Int(TimerDiff($AHUDFsKey_Merken_Repeatzeit)))
    ; Neue Taste gedrückt
    If $Anders And Not($Aktuell = $KeineTaste) Then
    If $Debug Then Beep(3000,150)
    $AHUDFsKey_Merken_Akt = $Aktuell
    $AHUDFsKey_Merken_Repeatzeit = TimerInit()
    Select ; Verhalten je nach Repeat-Modus
    Case $Repeat = False
    Return $Aktuell
    Case $Repeat = "Loslassen"
    Return $KeineTaste
    Case $Repeat = "Doppelklick"
    If $AHUDFsKey_Merken_AnzKlicks < 1 Then
    $AHUDFsKey_Merken_Anschlagbeginn = TimerInit()
    $AHUDFsKey_Merken_AnzKlicks += 1
    $AHUDFsKey_Merken_SelbeTaste = $Aktuell
    Return $Aktuell
    Else
    $AHUDFsKey_Merken_AnzKlicks = 0
    If $AHUDFsKey_Merken_SelbeTaste = $Aktuell Then
    Return "Doppelklick "&$Aktuell
    Else
    Return $Aktuell
    EndIf
    EndIf
    Case $Repeat > 0 ; einfaches Repeat
    $AHUDFsKey_Merken_Repeatzeit = TimerInit()
    Return $Aktuell
    Case $Repeat < 0 ; Repeat mit Anschlagverzögerung
    $AHUDFsKey_Merken_Repeatzeit = TimerInit()
    $AHUDFsKey_Merken_Anschlagbeginn = $AHUDFsKey_Merken_Repeatzeit
    Return $Aktuell
    EndSelect
    EndIf
    ; Taste wird z.Zt. immer noch gedrückt
    If Not($Aktuell = $KeineTaste) Then
    If $Debug Then Beep()
    Select ; Verhalten je nach Repeat-Modus
    Case $Repeat = False
    Return $KeineTaste
    Case $Repeat = "Loslassen"
    Return $KeineTaste
    Case $Repeat = "Doppelklick"
    Return $KeineTaste
    Case $Repeat > 0 ; einfaches Repeat
    If TimerDiff($AHUDFsKey_Merken_Repeatzeit) > $Repeat Then
    $AHUDFsKey_Merken_Repeatzeit = TimerInit()
    Return $Aktuell
    Else
    Return $KeineTaste
    EndIf
    Case $Repeat < 0 ; Repeat mit Anschlagverzögerung
    If (TimerDiff($AHUDFsKey_Merken_Repeatzeit) > -$Repeat) And (TimerDiff($AHUDFsKey_Merken_Anschlagbeginn) > $Delay) Then
    $AHUDFsKey_Merken_Repeatzeit = TimerInit()
    Return $Aktuell
    Else
    Return $KeineTaste
    EndIf
    EndSelect
    EndIf
    ; Taste gerade wieder losgelassen
    If $Anders And ($Aktuell = $KeineTaste) Then
    If $Debug Then Beep(150,300)
    $AHUDFsKey_Merken_Akt2 = $AHUDFsKey_Merken_Akt
    $AHUDFsKey_Merken_Akt = $Aktuell
    Select ; Verhalten je nach Repeat-Modus
    Case $Repeat = False
    Return $KeineTaste
    Case $Repeat = "Loslassen"
    Return $AHUDFsKey_Merken_Akt2
    Case $Repeat = "Doppelklick"
    Return $KeineTaste
    Case $Repeat > 0 ; einfaches Repeat
    Return $KeineTaste
    Case $Repeat < 0 ; Repeat mit Anschlagverzögerung
    Return $KeineTaste
    EndSelect
    EndIf
    ; z.Zt. wird keine Taste gedrückt
    If $Debug Then Beep(5000)
    If ($Repeat = "Doppelklick") And (TimerDiff($AHUDFsKey_Merken_Anschlagbeginn) > $Delay) And ($AHUDFsKey_Merken_AnzKlicks > 0) Then $AHUDFsKey_Merken_AnzKlicks = 0
    Return $KeineTaste
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;*************************************
    ;* *
    ;* Unterfunktion *
    ;* *
    ;*************************************
    #Region
    Func AHUDFKey_WelcheTaste($Name=Default, $Repeat=False)
    If Not($User32DLL) Then $User32DLL = DllOpen("user32.dll")
    Local $Code, $Code2 = False
    Switch $Name
    ;****************************************************************
    ; Tastenname oder Hex-Code als Returnwert
    ;****************************************************************
    Case Default, "HEX"
    For $n = 254 to 1 Step -1
    If _IsPressed(Hex($n,2), $User32DLL) Then ExitLoop
    Next
    If $Name = "HEX" Then Return Hex($n,2) ; Hex-Code
    Switch Hex($n,2)
    ;======================================================
    ; Maustasten
    ;======================================================
    Case "01"
    $Name = "LMAUS"
    Case "02"
    $Name = "RMAUS"
    Case "04"
    $Name = "MMAUS"
    Case "05"
    $Name = "X1MAUS"
    Case "06"
    $Name = "X2MAUS"
    ;======================================================
    ; Shift, Strg, Alt, Win
    ;======================================================
    Case "A0"
    $Name = "LSHIFT"
    Case "A1"
    $Name = "RSHIFT"
    Case "A2"
    $Name = "LCTRL"
    Case "A3"
    $Name = "RCTRL"
    Case "A4"
    $Name = "LALT"
    Case "A5"
    $Name = "RALT"
    Case "5B"
    $Name = "LWIN"
    Case "5C"
    $Name = "RWIN"
    ;======================================================
    ; Cursor, Seite
    ;======================================================
    Case "25"
    $Name = "LEFT"
    Case "27"
    $Name = "RIGHT"
    Case "26"
    $Name = "UP"
    Case "28"
    $Name = "DOWN"
    Case "24"
    $Name = "HOME"
    Case "23"
    $Name = "END"
    Case "21"
    $Name = "PGUP"
    Case "22"
    $Name = "PGDN"
    ;======================================================
    ; Zehner-Tastatur
    ;======================================================
    Case "6A"
    $Name = "NUMPADMULT"
    Case "6B"
    $Name = "NUMPADADD"
    Case "6D"
    $Name = "NUMPADSUB"
    Case "6E"
    $Name = "NUMPADDOT"
    Case "6F"
    $Name = "NUMPADDIV"
    ;======================================================
    ; sonstige Zeichen
    ;======================================================
    Case "BC"
    $Name = ","
    Case "BD"
    $Name = "-"
    Case "BE"
    $Name = "."
    Case "DB"
    $Name = "ß"
    Case "DC"
    $Name = "°"
    Case "DD"
    $Name = "´"
    Case "E2"
    $Name = "<"
    Case "20"
    $Name = "SPACE"
    ;======================================================
    ; sonstige Steuerung
    ;======================================================
    Case "08"
    $Name = "BACKSPACE"
    Case "09"
    $Name = "TAB"
    Case "0D"
    $Name = "ENTER"
    Case "13" ; Achtung: Code nur sehr kurz abrufbar (Sleep() kann zu falschen Ergebnissen führen; auch keine Tastenwiederholung
    $Name = "PAUSE"
    Case "14"
    $Name = "CAPSLOCK toggle"
    Case "1B"
    $Name = "ESC"
    Case "2C"
    $Name = "PRINTSCREEN"
    Case "2D"
    $Name = "INS"
    Case "2E"
    $Name = "DEL"
    Case "5D"
    $Name = "APPSKEY"
    Case "90"
    $Name = "NUMLOCK toggle"
    Case "91"
    $Name = "SCROLLLOCK toggle"
    ;======================================================
    ; keine Taste gedrückt
    ;======================================================
    Case "00"
    $Name = False
    ;======================================================
    ; A-Z, 0-9, F1-F16 oder direkter Tastaturcode
    ;======================================================
    Case ELSE
    Select
    Case ($N >= 112) And ($N <= 127)
    $Name = "F"&$N-111
    Case ($N >= 96) And ($N <= 105)
    $Name = "NUMPAD"&$N-96
    Case ($N >= Asc("A")) And ($N <= Asc("Z"))
    $Name = Chr($N)
    Case ($N >= Asc("a")) And ($N <= Asc("z"))
    $Name = Chr($N-32)
    Case ($N >= Asc("0")) And ($N <= Asc("9"))
    $Name = Chr($N)
    Case Else ; direkter Tastaturcode wie in _IsPreset, da keine passende Zuordnung gefunden wurde
    $Name = Hex($N,2)
    EndSelect
    EndSwitch
    Return $Name
    ;****************************************************************
    ; True / False als Returnwert
    ;****************************************************************
    ;==============================================================
    ; Maustasten
    ;==============================================================
    Case "LMAUS", "L Maus", "LINKE MAUS", "MAUS L", "MAUS LINKS"
    $Code = "01"
    Case "RMAUS", "R MAUS", "RECHTE MAUS", "MAUS R", "MAUS RECHTS"
    $Code = "02"
    Case "MMAUS", "M MAUS", "MITTLERE MAUS", "MAUS M", "MAUS MITTE"
    $Code = "04"
    Case "1MAUS", "X1MAUS", "X1 MAUS", "MAUS X1"
    $Code = "05"
    Case "2MAUS", "X2MAUS", "X2 MAUS", "MAUS X2"
    $Code = "06"
    ;==============================================================
    ; Shift, Strg, Alt, Win
    ;==============================================================
    Case "LSHIFT", "L SHIFT", "SHIFT L", "SHIFT LINKS", "LINKE SHIFT"
    $Code = "A0"
    Case "RSHIFT", "R SHIFT", "SHIFT R", "SHIFT RECHTS", "RECHTE SHIFT"
    $Code = "A1"
    Case "LCTRL", "L CTRL", "CTRL L", "CTRL LINKS", "LINKE CTRL", "LSTRG", "L STRG", "STRG L", "STRG LINKS", "LINKE STRG"
    $Code = "A2"
    Case "RCTRL", "R CTRL", "CTRL R", "CTRL RECHTS", "RECHTE CTRL", "RSTRG", "R STRG", "STRG R", "STRG RECHTS", "RECHTE STRG"
    $Code = "A3"
    Case "LALT", "L ALT", "ALT L", "ALT LINKS", "LINKE ALT"
    $Code = "A4"
    Case "RALT", "R ALT", "ALT R", "ALT RECHTS", "RECHTE ALT", "ALTGR", "ALT GR"
    $Code = "A5"
    Case "LWIN", "L WIN", "LWINDOWS", "L WINDOWS", "WIN L", "WIN LINKS", "WINDOWS L", "WINDOWS LINKS", "LINKE WIN", "LINKE WINDOWS"
    $Code = "5B"
    Case "RWIN", "R WIN", "RWINDOWS", "R WINDOWS", "WIN R", "WIN RECHTS", "WINDOWS R", "WINDOWS RECHTS", "RECHTE WIN", "RECHTS WINDOWS"
    $Code = "5C"
    Case "SHIFT" ; egal ob li/re
    $Code = "A0"
    $Code2 = "A1"
    Case "CTRL", "STRG" ; egal ob li/re
    $Code = "A2"
    $Code2 = "A3"
    Case "ALT" ; egal ob li/re
    $Code = "A4"
    $Code2 = "A5"
    Case "WIN", "WINDOWS" ; egal ob li/re
    $Code = "5B"
    $Code2 = "5C"
    ;==============================================================
    ; Cursor, Seite
    ;==============================================================
    Case "LEFT", "CURSOR LEFT", "CURSOR LINKS", "LINKS"
    $Code = "25"
    Case "RIGHT", "CURSOR RIGHT", "CURSOR RECHTS", "RECHTS"
    $Code = "27"
    Case "UP", "CURSOR UP", "CURSOR HOCH", "CURSOR RAUF", "HOCH", "RAUF"
    $Code = "26"
    Case "DOWN", "CURSOR DOWN", "CURSOR RUNTER", "RUNTER"
    $Code = "28"
    Case "HOME", "POS1", "POS 1"
    $Code = "24"
    Case "END", "ENDE"
    $Code = "23"
    Case "PGUP", "PG UP", "PAGEUP", "PAGE UP", "BILD HOCH", "BILD RAUF", "SEITE HOCH", "SEITE RAUF"
    $Code = "21"
    Case "PGDN", "PG DN", "PGDOWN", "PG DOWN", "PAGEDOWN", "PAGE DOWN", "BILD RUNTER", "SEITE RUNTER"
    $Code = "22"
    ;==============================================================
    ; Zehner-Tastatur
    ;==============================================================
    Case "NUMPAD*", "NUMPAD *", "NUMPADMULT"
    $Code = "6A"
    Case "NUMPAD+", "NUMPAD +", "NUMPADADD"
    $Code = "6B"
    Case "NUMPAD-", "NUMPAD -", "NUMPADSUB"
    $Code = "6D"
    Case "NUMPAD,", "NUMPAD ,", "NUMPAD KOMMA", "NUMPADDOT"
    $Code = "6E"
    Case "NUMPAD:", "NUMPAD :", "NUMPADDIV"
    $Code = "6F"
    ;==============================================================
    ; sonstige Zeichen
    ;==============================================================
    Case ",", ";", "KOMMA"
    $Code = "BC"
    Case "-", "_"
    $Code = "BD"
    Case ".", ":", "PUNKT"
    $Code = "BE"
    Case "ß", "?", "\"
    $Code = "DB"
    Case "°", "^"
    $Code = "DC"
    Case "´", "`"
    $Code = "DD"
    Case "<", ">", "|"
    $Code = "E2"
    Case " ", "SPACE"
    $Code = "20"
    ;==============================================================
    ; sonstige Steuerung
    ;==============================================================
    Case "BS", "BACKSPACE"
    $Code = "08"
    Case "TAB", "TABULATOR"
    $Code = "09"
    Case "RETURN", "ENTER"
    $Code = "0D"
    Case "PAUSE"
    $Code = "13"
    Case "CAPSLOCK", "CAPSLOCK toggle"
    $Code = "14"
    Case "ESC", "ESCAPE"
    $Code = "1B"
    Case "DRUCK", "DRUCKEN", "PRINTSCREEN", "PRINT SCREEN"
    $Code = "2C"
    Case "INS", "INSERT", "EINFG", "EINFÜGEN"
    $Code = "2D"
    Case "DEL", "DELETE", "ENTF", "ENTFERNEN"
    $Code = "2E"
    Case "KONTEXT", "Context", "APPSKEY"
    $Code = "5D"
    Case "NUM", "NUMLOCK", "NUMLOCK toggle"
    $Code = "90"
    Case "ROLLEN", "SCROLLLOCK", "SCROLLLOCK toggle"
    $Code = "91"
    ;==============================================================
    ; keine Taste gedrückt
    ;==============================================================
    Case ""
    For $n = 0 to 255
    If _IsPressed(Hex($n,2), $User32DLL) Then ExitLoop
    Next
    If $n >= 255 Then Return True
    ;==============================================================
    ; A-Z, 0-9, F1-F16 oder direkter Tastaturcode
    ;==============================================================
    Case ELSE
    Switch StringLen($Name)
    Case 1
    If (Asc($Name) >= Asc("A")) And (Asc($Name) <= Asc("Z")) Then $Code = Hex(ASC($Name)) ; A-Z
    If (Asc($Name) >= Asc("0")) And (Asc($Name) <= Asc("9")) Then $Code = Hex(ASC($Name)) ; 0-9
    Case 2
    If ((Asc(StringLeft($Name,1)) >= Asc("0")) And (Asc(StringLeft($Name,1)) <= Asc("9"))) Or ((Asc(StringLeft($Name,1)) >= Asc("A")) And (Asc(StringLeft($Name,1)) <= Asc("E"))) Then $Code = $Name ; direkt der Tastaturcode wie bei _IsPreset
    If StringLeft($Name,1) = "F" Then $Code = Hex(111+Number(StringTrimLeft($Name,1))) ; F1-F9
    Case 3
    If StringLeft($Name,1) = "F" Then $Code = Hex(111+Number(StringTrimLeft($Name,1))) ; F10-F16
    Case 4
    If StringLeft($Name,3) = "NUM" Then $Code = Hex(96+Number(StringRight($Name,1))) ; Num0-Num9
    Case 5
    If StringLeft($Name,4) = "NUM " Then $Code = Hex(96+Number(StringRight($Name,1))) ; Num0-Num9
    Case 7
    If StringLeft($Name,6) = "NUMPAD" Then $Code = Hex(96+Number(StringRight($Name,1))) ; Num0-Num9
    EndSwitch
    EndSwitch
    Return _IsPressed($Code, $User32DLL) Or _IsPressed($Code2, $User32DLL)
    EndFunc
    #EndRegion

    [/autoit]

    Und hier ein Beispielskript zum genauen Verständnis:

    Spoiler anzeigen
    [autoit]

    ;*******************************************
    ;* *
    ;* Beispiel zum Befehl Key() *
    ;* *
    ;*******************************************
    ;Autor: Deep Thought (http://www.autoit.de)
    ;Syntax: Key($Tastenname, $Repeatmethode, $Delay)

    [/autoit] [autoit][/autoit] [autoit]

    #include "Key.au3"
    Dim $Taste, $AHUDFsTaste_Merken_Akt2, $Warten
    ;Beispiel 1
    MsgBox(0,"Key( ) - Beispiel 1/5","Key( ) - ohne Parameter gibt den Namen der gedrückten Taste einmal wieder."&@CRLF&@CRLF&"Abbruch mit ""ESC"".")
    While Not($Taste="ESC")
    If TimerDiff($Warten)>400 Then $Taste=Key() ; Damit Tastenname im Tooltip lesbar
    If $Taste<>False And TimerDiff($Warten)>401 Then $Warten = TimerInit()
    ToolTip("Beispiel 1 - Tastenname: "&@CRLF&@CRLF&$Taste)
    WEnd
    While Not(Key(Default,"Loslassen"))
    ToolTip("Bitte Taste wieder loslassen !")
    WEnd
    ToolTip("")
    ;Beispiel 2
    MsgBox(0,"Key( ) - Beispiel 2/5","Key(""HEX"") - gibt den Hex-Code der gedrückten Taste einmal wieder."&@CRLF&@CRLF&"Abbruch mit ""ESC"".")
    While Not($Taste="1B")
    If TimerDiff($Warten)>400 Then $Taste=Key("HEX") ; Damit Tastenname im Tooltip lesbar
    If $Taste<>"00" And TimerDiff($Warten)>401 Then $Warten = TimerInit()
    ToolTip("Beispiel 2 - Hex-Code: "&@CRLF&@CRLF&$Taste)
    WEnd
    While Not(Key(Default,"Loslassen"))
    ToolTip("Bitte Taste wieder loslassen !")
    WEnd
    ToolTip("")
    ;Beispiel 3
    MsgBox(0,"Key( ) - Beispiel 3/5","Key( ""PAUSE"" ) - fragt ab, ob eine bestimmte Taste gedrückt ist,"&@CRLF&"in diesem Beispiel die Pause-Taste."&@CRLF&@CRLF&"Abbruch mit ""ESC"".")
    While Not(Key("ESC"))
    ToolTip("Beispiel 3 - Bitte die ""Pause""-Taste drücken ")
    If Key("PAUSE") Then Beep(2000,200)
    Sleep(2)
    WEnd
    While Not(Key(Default,"Loslassen"))
    ToolTip("Bitte Taste wieder loslassen !")
    WEnd
    ToolTip("")
    ;Beispiel 4
    MsgBox(0,"Key( ) - Beispiel 4/5","Key( , ""Standard"" ) - Standard-Repeat mit"&@CRLF&"800 msek Anschlag-Wiederholverzögerung"&@CRLF&"und einer Wiederholgeschwindigkeit von 200 msek."&@CRLF&@CRLF&"Abbruch mit ""ESC"".")
    While Not($Taste="ESC")
    $Taste=Key(Default,"Standard")
    If $Taste Then Beep(2000,50)
    WEnd
    While Not(Key(Default,"Loslassen"))
    ToolTip("Bitte Taste wieder loslassen !")
    WEnd
    ToolTip("")
    $Taste = False
    ;Beispiel 5
    MsgBox(0,"Key( ) - Beispiel 5/5","Key( , ""Doppelklick"" ) - überprüft, ob eine Taste in einem definierten Zeitraum"&@CRLF&"(hier 500 msek) nur einmal oder doppelt angeschlagen wurde."&@CRLF&@CRLF&"Abbruch mit ""ESC"".")
    ; Die Tasten "SHIFT", "STRG" und "ALT" machen hier etwas Probleme; vielleicht liegt das am Betriebssystem
    While Not($Taste="ESC")
    $Taste=Key(Default,"Doppelklick")
    If StringLeft($Taste,12)="Doppelklick " Then Beep(3000,50)
    WEnd
    While Not(Key(Default,"Loslassen"))
    ToolTip("Bitte Taste wieder loslassen !")
    WEnd
    ToolTip("")

    [/autoit]


    Über Feedback und konstruktive Kritik würde ich mich freuen. ;)

  • Find ich cool..
    Sehr gut, dass du das gemacht hast da einige (und da meine ich mich eingschlossen) probleme damit hatten...
    Das hast du sehr verständlich gemacht...

    Frage: Hat das auch eine Abfrage, wenn irgendetwas gedrückt wird, dass man dann als Rückgabewert die Taste bekommt? Wäre toll denn das bräuchte ich mal..

    Nochmal ein Lob von mir..

    MFG Schnacko

  • Hallo Schnacko,

    ja kann man beides. Ich erläutere am besten noch mal kurz, welche Möglichkeiten man alles hat:


    Beispiel 1: Man kann abfragen, ob eine bestimmte Taste gerade gedrückt wird

    [autoit]

    While Not Key("F8")
    WEnd

    [/autoit]

    Beispiel 2: Man kann abfragen, welche Taste gerade gedrückt wird

    [autoit]

    While 1
    Switch Key()
    Case "Pause"
    MsgBox(0,"","Pause-Taste wurde gedrückt")
    Case "F3"
    MsgBox(0,"","Taste F3 wurde gedrückt")
    Case "ESC"
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Beispiel 3: Man kann den Tasten-Hexcode (wie bei _IsPresed) direkt abfragen:

    [autoit]

    While 1
    $ASCII = Number("0x"&Key("Hex"))
    Select
    Case $ASCII>0x40 And $ASCII<0x5B
    MsgBox(0,"","Es wurde ein Buchstabe zwischen A-Z gedrückt")
    Case $ASCII>0x6F And $ASCII<0x80
    MsgBox(0,"","Es wurde eine F-Taste (F1-F16) gedrückt")
    Case $ASCII=0x1B ;Escape
    Exit
    EndSelect
    WEnd

    [/autoit]

    Beispiel 4: Man kann abfragen, ob zur Zeit keine Taste gedrückt wird

    [autoit]

    While Key("")
    ToolTip("Es wird gerage keine Taste gedrückt")
    WEnd

    [/autoit]

    Beispiel 5: Man kann abfragen, ob die gedrückte Taste inzwischen wieder losgelassen wurde (Schlagwort "Loslassen")

    [autoit]

    While Not(Key(Default,"Loslassen"))
    ToolTip("Bitte Taste wieder loslassen !")
    WEnd

    [/autoit]

    Beispiel 6: Man kann Tastenwiederholung duzuschalten (Schlagwort "Standard")

    [autoit]

    While Not $Taste="ESC"
    $Taste=Key(Default,"Standard")
    If $Taste Then Beep(2000,50)
    WEnd

    [/autoit]

    Beispiel 7: Man kann die Tastenwiederholung auch selber genau definieren, z.B. 600 ms Verzögerung nach dem Anschlagbeginn und danach Repeat alle 120 ms

    [autoit]

    Local $Taste
    While Not ($Taste="ESC")
    $Taste=Key(Default,-120,600)
    If $Taste Then Beep(2000,50)
    WEnd

    [/autoit]

    Beispiel 8: Man kann abfragen, ob eine Taste einfach oder als Doppelklick gedrückt wurde (Schlagwort "Doppelklick")

    [autoit]

    While 1
    Switch Key(Default,"Doppelklick",380) ;der 2. Klick muß spätestens 380 ms nach dem 1. Klick erfolgen
    Case "LMAUS"
    Beep(2000,100)
    Case "Doppelklick LMAUS"
    MsgBox(262144,"","Doppelklick der linken Maustaste")
    Case "ESC"
    Exit
    EndSwitch
    WEnd

    [/autoit]


    Ich hoffe, die Funktionsvielfalt wird jetzt noch etwas deutlicher. :)

  • sehr guuut gemacht...

    nur eine sache:

    Es wird nicht erkannt, wenn 2 Tasten gedrückt werden...

    oder mache ich das falsch..?

    [autoit]

    #include <Key.au3>

    [/autoit][autoit][/autoit][autoit]

    Local $Taste
    While Not ($Taste="ESC")
    $Taste=Key(Default,-120,1600)
    If $Taste Then ConsoleWrite($Taste)
    WEnd

    [/autoit]

    Drücke Shift und e ... oder Windows und d ...

    Wenn man aber 2 Buchstaben zeitlich etwas versetzt drückt, wird dies komischerweise erkannt...

    hmmm....

  • hi

    Ich bin schon seit einiger zeit auf der suche nach Hotkey die wirklich funktionieren. soetwas gibt es nur leider fürs autoit nicht als UDF.
    Daher denke ich an eine UDF zu schreiben die "alles" kann.

    Eins kann ich dir leider sagen Deep Thought - das ganz mit _IsPressed funktioniert nicht, und nen Doppelclick als solchen kannst du schon garnicht erkennen mit dem script.
    Das fängt schon dabei an dass viele user eine andere zeit bei einem Doppleclick definiert haben und .... mit einem wort es ist halbwegs kompliziert, alleine einen doppelclick richtig zu erkennen.

    Ich erstelle heute noch Tread mit der frage zu Hotkeys und wer welche idee hat und so und stelle evt mein konzept vor. schau hald mal vorbei.

    Mfg Dominic

  • Hey evtl komm ich ein wenig spät aber ich habe beim benutzen deiner UDF immer etwas vermisst entweder bin ich zu blöd auf die Funktion zuzugreifen dafür oder die Funktion war wirklich nicht dabei.
    Und zwar wollte ich nicht jede Taste einzeln abfragen mit:

    AutoIt
    While 1
       While Key()
          Switch Key()
            case "A"
               MsgBox(0,"Info","Es wurde A gedrückt")
          EndSwitch
       Wend
    Wend

    mit dieser kleinen Änderung kann man jetzt einfach:

    AutoIt
    While 1
       While Key()
    	  MsgBox(0,"","Es wurde "&Key("NAME")&" gedrückt")
       WEnd
    WEnd

    allerdings nur kann man nicht die Duration und Tastenkobinationen abfragen evtl macht das ja noch einer ;)
    Da ich auch kein Beispiel von Deep Thought finden konnte hab ich das ergänzt vill. kann das ja noch ein anderer gebrauchen

    Spoiler anzeigen