_ispressed If-Abfrage

  • Hallo,

    ich habe ein Problem mit einer Tastatur-Abfrage.
    (Anwender hat starke Sehprobleme) Es ist etwas schwierig
    zu erlären. Weiß irgendwie nicht so richtig wie man da rangehen kann.
    Ich versuch's mal:

    Das Problem:

    Spoiler anzeigen



    Ziel:
    Anwender soll auf die F5 Taste drücken!

    Anwender-Versuch: er drückt z.B. auf die Taste K, weil es es nicht sieht....
    Meldung: z.B. FALSCH das ist der Tastaturbereich, bitte etwas höher...
    Anwender-Versuch: er drückt z.B. auf die Taste F7
    Meldung: z.B. FAST das sind die Funktionstasten, hier bist du richtig, bitte etwas nach links....

    Kann man z.B. Bereiche eingrenzen?

    Spoiler anzeigen


    Drückt er im numerischen Block...
    Msgbox...Falsch
    Drückt er im Navigationsblock ...
    Msgbox...OK


    [autoit]


    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    While 1
    Sleep ( 250 )
    IF _ISPRESSED("71", $DLL) THEN ;F9
    MsgBox(0,"Prima","Das ist die richtige Taste")

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

    SLEEP(10)
    ELSEIF _ISPRESSED("72",$DLL) THEN ; hier bin ich nicht weiter gekommen <>...
    MsgBox(0,"Nochmal...","Leider fasch"); hier habe ich probiert, komme aber nicht weiter...
    EndIf

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

    WEnd
    DllClose($dll)

    [/autoit]

    Das Problem ist, ich möchte ihn mit Hilfe von Beep oder anderen Ereignissen
    bis zum Ziel steuern.

    Würde mich über eure Hilfe sehr freuen.

    Liebe Grüße
    Ilse ;)

  • Hallo,
    merci, daß du dich meldest.
    Daß man einfach die F5 Taste drücken kann ist schon klar, aber nicht Zweck der Sache.
    Also, dieser Mann ist etwas älter, und hat mit der Tastatur erhebliche Probleme (zittert...)
    Ich habe versprochen daß ich da vielleicht helfen kann.
    Er würde so gerne, kann aber leider nicht...

    Aber "Trainingsspiel" ist vielleicht doch eine nette Idee!!! Würde sich bestimmt freuen

    Kannst du mir da etwas unter die Arme greifen? Vielleicht ein paar Ansätze, damit ich irgendwie ans Ziel komme?

    Liebe Grüße
    Ilse ;)

  • Du könntest die Tasten in einem zweidimensionalem Array speichern. Die erste Dimension würde für die verschiedenen Bereiche der Tastatur stehen, während die zweite die einzelnen Tasten (und evtl. auch ihre IDs für _IsPressed) beinhalten würde.
    Dieses Array fragst du in bestimmten Zeitabständen (z.B. 30-50ms) mithilfe von 2 For Schleifen ab. Eine für den ersten Index und eine für den Zweiten. Wenn eine Taste gedrückt wird, und es ist nicht die richtige, kannst du danach direkt abfragen ob es denn der richtige Bereich ist (mit dem ersten Index). Je nach Ergebnis kannst du dann verschiedene MsgBoxes generieren.

  • Hallo name22,

    huh...ich kann zwar noch nicht so 100% folgen
    aber ich habe mal versucht die Bereiche aufzubauen:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>
    #include <array.au3>

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

    Local $Bereich[5][2]

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

    $Bereich[0][0] = "Standardtasten"
    $Bereich[0][1] = "Taste A-Z und 1-10"
    $Bereich[1][0] = "Funktionstasten"
    $Bereich[1][1] = "F1-F12"
    $Bereich[2][0] = "Navigationsbereich"
    $Bereich[2][1] = "Pfeiltasten-POS..."
    $Bereich[3][0] = "Nummernblock"
    $Bereich[3][1] = "Rechner-Tastatur"
    $Bereich[4][0] = "Andere"
    $Bereich[4][1] = "Windows-Tasten TAB..."

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

    For $i = 0 To UBound($Bereich) -1
    For $k = 0 To UBound($Bereich,2) -1
    $Test = ($Bereich[$i][$k] & @CRLF)

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

    MsgBox(0,"",$Test)
    Next
    Next

    [/autoit]

    das mit den Zeitabständen (z.B. 30-50ms) mithilfe von 2 For Schleifen ...
    und den ganzen Tasten??? _ispressed...das hab ich nicht verstanden.

    Kannst du mir da vielleicht ein Beispiel machen?


    Liebe Grüße
    Ilse ;)

  • Das mit dem 2-dimensionalen Array wird so wie ich es mir gedacht hab nicht wirklich klappen. Besser wäre es vielleicht so:
    $Array[105][3] ;erster Index = Anzahl der Tasten
    $Array[0][0] = "1" ;Name der Taste ("e", "1", "Escape", "Return" etc.)
    $Array[0][1] = "31" ;_IsPressed ID
    $Array[0][2] = 2 ;Tastengruppe zu der die Taste gehört.

    In einer For Schleife kannst du dann jede einzelne Taste abfragen:
    For $i = 0 To 104
    If _IsPressed($Array[$i][1]) Then ...
    Next
    Das machst du wiederholt im Abstand von z.B. 30-50ms.

    Falls ein Tastendruck registriert wurde, fragst du als erstes ab, ob es die richtige Taste ist. Falls nicht, fragst du ab, ob es die richtige Gruppe ist (Array-Index 2). Dann kannst du für jeden Fall eine entsprechende Antwort formulieren. Das ganze lässt sich natürlich noch weiter ausbauen.

  • Hallo name22,

    bekomme leider direkt eine Fehlermeldung.
    Meinst du irgendwie so?

    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>
    #include <array.au3>
    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    $Taste[105][3] ;erster Index = Anzahl der Tasten
    $Taste[0][0] = "1" ;Name der Taste ("e", "1", "Escape", "Return" etc.)
    $Taste[0][1] = "31" ;_IsPressed ID
    $Taste[0][2] = 2 ;Tastengruppe zu der die Taste gehört.

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

    $Zahl[10][3] ;erster Index = Anzahl der Tasten
    $Zahl[0][0] = "1" ;Name der Taste ("e", "1", "Escape", "Return" etc.)
    $Zahl[0][1] = "38" ;_IsPressed ID
    $Zahl[0][2] = 3 ;Tastengruppe zu der die Taste gehört.

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

    For $i = 0 To 104
    If _IsPressed($Taste[$i][1]) Then
    MsgBox(0,"","OK")
    ELSE
    MsgBox(4096,"Nochmal...","Leider fasch")
    EndIf
    Next

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

    DllClose($dll)

    [/autoit]

    uff..Kannst du vielleicht mal ein Beipiel machen?
    Sagen wir, ich will daß er die Tasten F5 - F10 drückt.
    Der _Ispressed Code wäre zwischen 74 bis 79
    Wie die Arrays da aufgebaut werden weiß ich nicht!

    :( Ilse

  • Hallo name22,

    ich glaube ich hab's.

    Eine Frage noch zu meinen Array-Freunden...
    Hab ich das richtig verstanden,
    ich muß jede Taste dem Array zuordnen? Die 105 Arrays ...

    Spoiler anzeigen


    Local $Taste[105][3] ;erster Index = Anzahl der Tasten
    $Taste[0][0] = "1" ;Name der Taste ("e", "1", "Escape", "Return" etc.)
    $Taste[0][1] = "31" ;_IsPressed ID
    $Taste[0][1] = "31" ;_IsPressed ID
    $Taste[0][2] = "32" ;_IsPressed ID
    $Taste[0][3] = "33" ;_IsPressed ID
    $Taste[0][4] = "34" ;_IsPressed ID
    $Taste[0][5] = "35" ;_IsPressed ID
    $Taste[0][6] = 2 ;Tastengruppe zu der die Taste gehört.

    Hier mal mein Code:

    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>
    #include <array.au3>
    #include <Misc.au3>

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

    $dll = DllOpen("user32.dll")

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

    Local $Taste[105][3] ;erster Index = Anzahl der Tasten
    $Taste[0][0] = "1" ;Name der Taste ("e", "1", "Escape", "Return" etc.)
    $Taste[0][1] = "31" ;_IsPressed ID
    $Taste[0][2] = 2 ;Tastengruppe zu der die Taste gehört.

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

    While 1
    Sleep ( 250 )
    For $i = 0 To 104
    If _IsPressed($Taste[$i][1]) Then
    MsgBox(4096,"","OK")
    EndIf
    Next

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

    WEnd

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

    DllClose($dll)

    [/autoit]

    Liebe Grüße
    Ilse ;)

  • Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>

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

    Global $iTargetKeyIndex = 3
    Global $aKeys[16][3]

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

    $vU32Dll = DllOpen("user32.dll")
    OnAutoItExitRegister("_Shutdown")

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

    #region Keys
    $aKeys[0][0] = "1"
    $aKeys[0][1] = "31"
    $aKeys[0][2] = 1
    $aKeys[1][0] = "2"
    $aKeys[1][1] = "32"
    $aKeys[1][2] = 1
    $aKeys[2][0] = "3"
    $aKeys[2][1] = "33"
    $aKeys[2][2] = 1
    $aKeys[3][0] = "4"
    $aKeys[3][1] = "34"
    $aKeys[3][2] = 1
    $aKeys[4][0] = "5"
    $aKeys[4][1] = "35"
    $aKeys[4][2] = 1
    $aKeys[5][0] = "6"
    $aKeys[5][1] = "36"
    $aKeys[5][2] = 1
    $aKeys[6][0] = "7"
    $aKeys[6][1] = "37"
    $aKeys[6][2] = 1
    $aKeys[7][0] = "8"
    $aKeys[7][1] = "38"
    $aKeys[7][2] = 1
    $aKeys[8][0] = "9"
    $aKeys[8][1] = "39"
    $aKeys[8][2] = 1
    $aKeys[9][0] = "0"
    $aKeys[9][1] = "30"
    $aKeys[9][2] = 1

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

    $aKeys[10][0] = "q"
    $aKeys[10][1] = "51"
    $aKeys[10][2] = 2
    $aKeys[11][0] = "w"
    $aKeys[11][1] = "57"
    $aKeys[11][2] = 2
    $aKeys[12][0] = "e"
    $aKeys[12][1] = "45"
    $aKeys[12][2] = 2
    $aKeys[13][0] = "r"
    $aKeys[13][1] = 52
    $aKeys[13][2] = 2
    $aKeys[14][0] = "t"
    $aKeys[14][1] = "54"
    $aKeys[14][2] = 2
    $aKeys[15][0] = "z"
    $aKeys[15][1] = "5A"
    $aKeys[15][2] = 2
    #endregion Keys

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

    While Sleep(40)
    For $i = 0 To 15
    If _IsPressed($aKeys[$i][1], $vU32Dll) Then
    If $iTargetKeyIndex = $i Then
    MsgBox(64, "Info", "Richtige Taste (" & $aKeys[$i][0] & ").")
    Else
    If $aKeys[$i][2] = $aKeys[$iTargetKeyIndex][2] Then
    MsgBox(64, "Info", "Richtige Gruppe")
    Else
    MsgBox(64, "Info", "Weit daneben")
    EndIf
    EndIf
    EndIf
    Next
    WEnd

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

    Func _Shutdown()
    DllClose($vU32Dll)
    EndFunc

    [/autoit]
  • Hallo Death,

    dachte auch schon daran,
    hatte auch das Beispiel gesehen, es aber leider nicht geschafft
    daß wenn eine Taste gedrückt wird
    die Stimme zu hören ist.

    ;) Ilse