_IsPressed in einer Schleife bei vielen Tasten langsam

  • Hi,

    ich frage mit meinem Script ca. 50 Tasten ab, mit jeder Taste wird das Script langsamer (auch wenn gar keine Taste gedrückt wurde).
    Gibt es eine Möglichkeit diese Abfrage zu beschleunigen? Als Beispiel ist das Beispiel aus der Hilfe, welches ich aber so in der Form übernommen habe.
    Ich weiß nicht ob eine Switch/Case Funktion Beschleunigung bringen würde, aber ich bekomme aus _IsPressed ja keine grundsätzliche Antwort ob überhaupt
    eine Taste gedrückt wurde. Dann bräuchte ich ja erst den Rest gar nicht befragen.

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

    Einmal editiert, zuletzt von Cape-City (8. Dezember 2016 um 20:47)

  • Hi,
    _ispressed() ist wieder mal so eine Schwachsinnsfunktion, die niemand wirklich braucht!
    In jedem Uralt-Basic und in jeder anderen vernünftigen Programmiersprache gibts einen inkey-Befehl, welcher einfach die gedrückte Taste bzw. den Tastaturcode zurück gibt!
    Aber da die AutoIt-Dev´s ja eher Angst vor Scriptkiddies mit Keylogger-Ambitionen haben, statt Tastaturabfragen ordentlich zu bearbeiten, bleibt wieder mal nichts weiter übrig, als die üblichen API-funktionen zu bemühen....
    Das kann man so machen

    oder so

    oder so


    oder so

    Tastatur für Bildschirm

  • Super! Danke! Das hilft mir schon etwas weiter. Ich habe derweil doch etwas im Internet gefunden. Das hat seinen Reiz,
    es wird nur einmal aufgerufen und ändert dann ohne weiteres Aufrufen eine Variable im Wert auf 1, wenn eine Taste
    gedrückt wurde. Schick wäre natürlich eine Kombi aus beiden, nicht nur das "im Hintergrund" warten, sondern auch den
    gedrückten Tastenwert zurück geben. Dann spart man noch zusätzlich Zeit beim auswerten der gedrückten Taste.

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

  • Nur der Vollständigkeit halber eine Version mit Events und GUI:

    lg
    M

  • Die letzte Variante ist auch interessant, da ja ebenfalls nur reagiert wird, wenn eine Taste gedrückt wurde, man weiß welche es war und kann entsprechend reagieren
    und viel besser, es wird nur reagiert, wenn die GUI tatsächlich im Focus ist. Aber wie kann man hier denn "Enter", "Coursor Up", "Num 0", etc abfragen?

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

  • Hi @Cape-City,

    schau dir dazu mal den Send-Befehl in der Hilfe an.

    Grüße autoiter

  • Ich weiß leider nicht wie genau die GUISetAccelerators Funktion intern arbeitet. Es kann sein, dass es auf den ersten Blick nach Konstantem Rechenaufwand aussieht (also, dass es egal ist ob man eine oder 100 Tasten registriert). Möglicherweise ist im Hintergrund aber auch eine linear skalierende Funktion am Werk, sodass es bei einer großen Anzahl registrierter Tasten auch langsam wird.

    Zudem muss man sich das Verhalten beim Tastendruck verinnerlichen. Wenn man drückt und gedrückt lässt wird sofort ein Event gesendet, dann kommt eine kurze Pause und dann kommen Events im Regelmäßigen Abstand (Gleiches Motto wie ein Textfeld in das man einen Buchstaben eintippt und die Taste gedrückt hält). _IsPressed und andere Funktionen können herausfinden ob die Taste in diesem Augenblick gedrückt ist, GUISetAccelerators kann das nicht, ob du die Taste nach 0.1 oder nach 0.2 Sek loslässt wird keinen Unterschied bei den Events machen.

    lg
    M

  • Zudem muss man sich das Verhalten beim Tastendruck verinnerlichen. Wenn man drückt und gedrückt lässt wird sofort ein Event gesendet, dann kommt eine kurze Pause und dann kommen Events im Regelmäßigen Abstand (Gleiches Motto wie ein Textfeld in das man einen Buchstaben eintippt und die Taste gedrückt hält). _IsPressed und andere Funktionen können herausfinden ob die Taste in diesem Augenblick gedrückt ist, GUISetAccelerators kann das nicht, ob du die Taste nach 0.1 oder nach 0.2 Sek loslässt wird keinen Unterschied bei den Events machen.

    Das stimmt, das hatte ich bei _IsPressed auch eingebaut. Hier war es auch ein Problem und man hatte richtig den Effekt des
    Tastenprellens. Bei einer deiner Methoden (habe sie mal ein wenig aufgehübscht), passiert das nicht. Klar kommt die Taste immer
    wieder, wenn man sie gedrückt hält, aber beim normalen Drücken (auch etwas länger) passiert nichts. Es gibt unter Windows
    ja auch diese Tastenanschlagverzögerung, ich denke das genau diese hier greift. Zudem muss man bei _IsPressed und dem Warten
    bis die Taste wieder "released" wurde aufpassen, das Script pausiert dann an der Stelle ;)

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2