Funktion die gedrückte/losgelassene Taste zurückgibt?

  • Hallo zusammen,
    Hab etwas gesucht aber nichts gefunden, was mein Problem beheben könnte. Ich habe hier ein Script geschrieben, dass mir einen Tastendruck visuell darstellt. Problem ist nur:
    Wenn man Q drückt (wird Q grün),lässt sich W nicht drücken (bleibt rot). Das liegt an dem While _IsKeyPressed -> Sleep. Das ist mir bekannt. Wie könnte ich das umgehen? (will ja nicht endlos verschachteln,bei allen Tasten auf der Tastatur).
    Habe mir ein/zwei Lösungen überlegt:

    • Funktion die zurückgibt, wenn eine Taste gedrückt UND losgelassen wird, ohne die Verwendung der im Script beschriebenen While-Schleife
    • GuiCtrlSetBkColor($Q,0x00FF00) nur temporär gültig (also auf Rot zurückspringen, ohne die Angabe von GuiCtrlSetBkColor($Q,0xFF0000))

    Leider konnte ich besagte Lösungen nicht finden. Oder habt ihr noch eine andere Idee?

    Hier das Script:

    Spoiler anzeigen
    [autoit]

    #Region ### START INCLUDES ###
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Misc.au3>
    #include <WindowsConstants.au3>
    #EndRegion ### END INCLUDES ###

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

    #Region ### START GLOBAL VARIABLES ###
    Global $hDLL = DllOpen("user32.dll")
    #EndRegion ### END GLOBAL VARIABLES ###

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 125, 74, 192, 124)
    $Q = GUICtrlCreateButton("Q", 0, 0, 20, 20)
    GUICtrlSetBkColor(-1, 0xFF0000)
    $W = GUICtrlCreateButton("W", 20, 0, 20, 20)
    GUICtrlSetBkColor(-1, 0xFF0000)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()

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

    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    DllClose($hDLL)
    Exit

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

    EndSwitch

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

    If _IsPressed("51", $hDLL) Then
    GuiCtrlSetBkColor($Q,0x00FF00)
    ; Wait until key is released.
    While _IsPressed("51", $hDLL)
    Sleep(100)
    WEnd
    GuiCtrlSetBkColor($Q,0xFF0000)
    EndIf

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

    If _IsPressed("57", $hDLL) Then
    GuiCtrlSetBkColor($W,0x00FF00)
    ; Wait until key is released.
    While _IsPressed("57", $hDLL)
    Sleep(100)
    WEnd
    GuiCtrlSetBkColor($W,0xFF0000)
    EndIf

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

    WEnd

    [/autoit]

    Off-Topic: Wie stell ich diesen Windows-sound *ding* aus, bei "illegalem" Tastendruck :D?

    Bin für alles offen :)
    Grüße

  • Oder du speicherst alle Controls in einem Array. Dann könntest du inner Schleife durchgehen, welche gedrückt werden. (Mit bedingung, damit nicht ständig die Farbe gesetzt wird, obwohl sie schon gesetzt ist)
    (Das mit dem $Timer ist nur, damit es nicht flackert)

    [autoit]

    #Region ### START INCLUDES ###
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Misc.au3>
    #include <WindowsConstants.au3>
    #EndRegion ### END INCLUDES ###

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

    #Region ### START GLOBAL VARIABLES ###
    Global $hDLL = DllOpen("user32.dll"),$Keys[2][3],$Timer
    #EndRegion ### END GLOBAL VARIABLES ###

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 125, 74, 192, 124)
    $Keys[0][0] = GUICtrlCreateButton("Q", 0, 0, 20, 20)
    $Keys[0][1]=false
    $Keys[0][2]="51"
    GUICtrlSetBkColor(-1, 0xFF0000)
    $Keys[1][0] = GUICtrlCreateButton("W", 20, 0, 20, 20)
    $Keys[1][1]=false
    $Keys[1][2]="57"
    GUICtrlSetBkColor(-1, 0xFF0000)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $Timer=TimerInit
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    DllClose($hDLL)
    Exit
    EndSwitch
    for $i=0 to UBound($Keys)-1 step 1
    $bool=_IsPressed($Keys[$i][2],$hDLL)
    if $bool and NOT $Keys[$i][1] then
    GuiCtrlSetBkColor($Keys[$i][0],0x00FF00)
    $Keys[$i][1]=true
    ElseIf Not $bool and $Keys[$i][1] then
    GuiCtrlSetBkColor($Keys[$i][0],0xFF0000)
    $Keys[$i][1]=False
    endif
    next
    if TimerDiff($Timer)<10 then
    Sleep(10)
    endif
    WEnd

    [/autoit]
  • @chesstiger :
    So wie ich das verstanden habe, würde es nur funktionieren, solange das Fenster im Fokus steht. Aber die Methode gefällt mir irgendwie :)

    @Kanashius :
    Das mit dem Array habe ich auch überlegt gehabt, aber könnte bei einer großen Anzahl an Tasten (nicht alle) sehr Ressourcenfressend sein, bzw. zu einem Delay führen oder? Trotzdem werde ich die Methode vorerst mal verwenden und ggf. verbessern, danke :)

    Vielleicht werde ich auch beide Methoden irgendwie verknüpfen. Aber danke dafür vorerst

    (Hat jemand eine Antwort auf die Off-Topic frage :P?)