• Moin zusammen!

    Ich habe mal ein kleines Skript geschrieben, mit dem man Tastendrücke registrieren kann. Es ist quasi eine Abwandlung von Misc.au3/_IsPressed trothdem find ich das ganz praktisch. Zusätzlich kann man auch einfach Tasten ignorieren lassen.

    Link: entfernt

    Würde mich über Rückmeldung freuen.

    Edit BugFix: Bitte NICHT extern verlinken. Hänge deine Datei hier an. ( Habe die Version aus deinem letzten Post jetzt hier angehängt.)

  • Finde ich super :)
    Nur ein paar dinge fehlen.
    - Es sollte noch einen $Mode 3 geben, der direkt die getippte Taste zurück gibt.
    Also bei wenn ich A drücke, dass nicht "41" sondern "A" zurück gegeben wird.
    - Eine eingebaute Funktion, die erkennt, ob die Taste noch gedrückt ist oder nicht.
    So dass nicht bei einem Tastendruck von 0,05 Sekunden, 20x die gedrückte Taste zurückgegeben wird. :)

    Ansonsten super :)

  • Alles, was in _GPL_Start() mit $GPK_Keys zu tun hat, könntest du eigentlich auch außerhalb der Funktion schreiben.
    Das solltest du eigentlich mit allen globalen Variablen machen, da sonst Fehler wie "WARNING: $vDLL: possibly used before declaration." auftreten, wobei dieser Fehler daran liegt, dass du in _GPK_SingleKey die Variable $vDLL verwendest, welche nirgends deklariert ist und mit welcher wahrscheinlich $GPK_vDLL gemeint ist.

    C:\Users\James\Desktop\GetPressedKeys.au3(323,24) : WARNING: $vDLL: possibly used before declaration.
    $a_R = DllCall($vDLL,
    ~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Users\James\Desktop\GetPressedKeys.au3(323,69) : WARNING: $i: possibly used before declaration.
    $a_R = DllCall($vDLL,"short","GetAsyncKeyState","int","0x"&Hex($i,
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Users\James\Desktop\GetPressedKeys.au3(323,24) : ERROR: $vDLL: undeclared global variable.
    $a_R = DllCall($vDLL,
    ~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Users\James\Desktop\GetPressedKeys.au3(323,69) : ERROR: $i: undeclared global variable.
    $a_R = DllCall($vDLL,"short","GetAsyncKeyState","int","0x"&Hex($i,
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Users\James\Desktop\GetPressedKeys.au3 - 2 error(s), 2 warning(s)

    Edit: Ich habe deine UDF mal (vereinfacht) nachgebaut, da ich eigentlich die Geschwindigkeit testen wollte. Momentan erreiche ich damit leider nur ca. 30ms/Aufruf, aber durch den erhöhten Funktionsumfang deiner UDF lässt sich das wahrscheinlich nicht vergleichen. Es wäre schön, wenn du versuchen könntest das ganze noch zu optimieren (falls das überhaupt geht).

    MfG, James

  • Habe die UDF mal mit nem einfachen Script getestet.
    http://pastebin.com/HgLRWkmJ

    (Mit dem [.autoit][/autoit.] wird bei mir alles in eine Zeile verschoben -.- deswegen der link...)

    Wenn ich das script ausführe,
    kommen folgende error meldungen:

    Spoiler anzeigen

    C:\Users\Michael\Desktop\_Pressed.au3(323,24) : WARNING: $vDLL: possibly used before declaration.
    $a_R = DllCall($vDLL,
    ~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Users\Michael\Desktop\_Pressed.au3(323,69) : WARNING: $i: possibly used before declaration.
    $a_R = DllCall($vDLL,"short","GetAsyncKeyState","int","0x"&Hex($i,
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Users\Michael\Desktop\_Pressed.au3(323,24) : ERROR: $vDLL: undeclared global variable.
    $a_R = DllCall($vDLL,
    ~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Users\Michael\Desktop\_Pressed.au3(323,69) : ERROR: $i: undeclared global variable.
    $a_R = DllCall($vDLL,"short","GetAsyncKeyState","int","0x"&Hex($i,
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Users\Michael\Desktop\xxx.au3 - 2 error(s), 2 warning(s)

  • bleibt immer noch
    C:\Users\Michael\Desktop\_Pressed.au3 (298) : ==> Subscript used with non-Array variable.:
    If BitAND($a_R[0], 0x8000) <> 0=True Then $Return=$Return&"|0x"&Hex($i,2)
    If BitAND($a_R^ ERROR

  • @commander Wenn du $vDLL durch $GPK_vDLL ersetzt, kannst du zumindest einen Teil der Fehler beheben.


    Wenn ich versuche die anderen Fehler zu beheben bleiben beide MsgBoxen in dem Beispiel leer. Könnte aber auch sein, dass in dem Skript noch viel mehr falsch ist und durch die zusätzlichen Fehlerüberprüfungen dann letzten Endes gar nichts mehr funktioniert.

    MfG, James

  • Sorry für die Fehler :S . Aber das da...


    Wenn ich versuche die anderen Fehler zu beheben bleiben beide MsgBoxen in dem Beispiel leer. Könnte aber auch sein, dass in dem Skript noch viel mehr falsch ist und durch die zusätzlichen Fehlerüberprüfungen dann letzten Endes gar nichts mehr funktioniert.


    Da hätte man das Skript aufmerksamer lesen müssen. Aber passiert schon ma, wie man an den Bugs sieht. :rolleyes:

    Dieser "Fehler" liegt daran, dass du nichts gedruckt hast. Wenn du z.B. F5 gedrückt hälst gehts.

    PS: Hab die Bugs behoben... hoffe ich

  • Dieser "Fehler" liegt daran, dass du nichts gedruckt hast. Wenn du z.B. F5 gedrückt hälst gehts.

    Ich bin mir sicher, dass die Fehler auch aufgetreten sind, als ich irgendwas gedrückt hatte, aber egal... ;)

    Edit: Wenn ich versuche die Geschwindigkeit mit einer For-Schleife und einem Timer zu messen, stützt das Skript wieder bei Zeile 295 (If BitAND($a_R[0], 0x8000) <> 0=True Then $Return=$Return&"|0x"&Hex($i,2)) ab, wahrscheinlich weil $a_R wieder kein Array ist.

  • Spoiler anzeigen
    [autoit]


    #include <_Pressed.au3>
    HotKeySet ("{ESC}", "_Stop")
    ;=============>
    While 1
    $Pressed = _GPK_KeyList(1)
    If $Pressed Then
    $String = _GPK_KeyList_StringHexToEng ($Pressed)
    ConsoleWrite ($String & "|")
    Sleep (100)
    EndIf
    WEnd
    ;=============>
    Func _Stop ()
    Exit
    EndFunc

    [/autoit]

    Wenn ich das so ausführe kommt immer noch:
    C:\Users\Michael\Desktop\_Pressed.au3 (295) : ==> Subscript used with non-Array variable.:
    If BitAND($a_R[0], 0x8000) <> 0=True Then $Return=$Return&"|0x"&Hex($i,2)
    If BitAND($a_R^ ERROR

    Habe das neue Script genommen.