_IsPressed Frage

  • Hallo liebe Community,

    Ich (voller Anfänger) stehe vor einem Problem. Ich möchte Gerne dass eine aktion erst bei längerem Drücken einer Taste ausgelöst wird.
    Siehe Code.

    Wäre für eine Hilfe im sehr einfache, verständlichen Stil, sehr dankbar :)


  • Alina, du hast ihn leider missverstanden. Er möchte abfragen ob die Leertaste länger als 0.3 Sekunden gedrückt wurden ist.

    Soa, jetzt guckst du mal in den einen Thread wo ich dir geantwortet habe. Mit ein wenig nachdenken klappt das auch dann. Sieh dir vor allem die Stelle an, wo ich mit den Timer Funktionen gearbeitet habe.

    Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2

  • Danke Make -Grafik.

    Ich habe mir deine Code bezüglich meiner anderen Frage angeschauht. Leider war das schon zu komplex für mein Verständnis.
    Könntest du mir das noch einmal vorgeben. Darauf könnte ich dann ableiten wie es mit dem Befehlt läuft.

    Auf jedenfall muss doch "down" und "up" mit in den quellcode oder?
    Und dann eine Abfrage: Wenn die Zeit zwischen down und up größer 300, dann

    Hab mich hier mal durchs forum geklickt. Es ist ja sagenhaft was man alles machen kann. Nur leider tue ich mich sehr schwer mit dem verstehen. Ich habe gemerkt dass ich gut nachbauen kann wenn ich vorlagen habe an denen ich mich orientieren kann.
    Wie das mit den Schleifen läuft weis ich ja nun auch :)

    Vllt könntest mir hier nochmal helfen.

    Vielen Dank

  • @rexderruede & Make-Grafik

    Laßt uns teilhaben an dem anderen Beitrag "guckst du mal in den einen Thread wo ich dir geantwortet habe". ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • ich antworte so viel, das ich den Überblick verliere. ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Alina:
    Ich bezog mich auf folgenden Thread: Anfängerfrage - Schleife in Autoit Skript?

    rexderruede:
    Gewöhne es dir bitte an hier im Forum für AutoIt Quelltext folgendes Format zu verwenden:

    Code
    [autoit]Code[/autoit]

    So lässt sich das einfach besser lesen. :)

    Zitat

    Hab mich hier mal durchs forum geklickt. Es ist ja sagenhaft was man alles machen kann.

    Ja, die Kunst des Programmierens besteht eigentlich nur darin, seine abstrakten Gedanken logisch sinnvoll als Quelltext zu Verfassen. Der Rest ist eigentlich wie Vokabeln lernen. Wissen was welcher Befehl macht und wie jedes Schlüsselwort arbeitet. :D

    Zitat

    Nur leider tue ich mich sehr schwer mit dem verstehen.

    Das macht überhaupt nichts. Wenn ich mal durch meine ersten Beiträge hier im Forum blättere, merke ich wie dumm ich mich damals angestellt habe.

    Zitat

    Ich habe gemerkt dass ich gut nachbauen kann wenn ich vorlagen habe an denen ich mich orientieren kann.

    Für den Anfang ist das wohl noch okay, aber wenn du ernsthaft programmieren möchtest, musst du versuchen selber die Dinge (auch ohne Vorlage) hin zu bekommen. Aber wie gesagt: Als Anfänger ist das vollkommen Okay und hilft enorm beim erlernen! Hab ich auch so gemacht. ^^

    Zitat

    Wie das mit den Schleifen läuft weis ich ja nun auch :)


    Super, die wirst du für dein Problem auch brauchen! :)

    Zitat

    Vllt könntest mir hier nochmal helfen.


    Stimmt, ich habe genug drum herum geredet. Klar helfe ich dir - Also:

    Du weißt doch sicherlich dass die _IsPressed() Funktion ein "True" entgegen spuckt, wenn du eine bestimmte Taste gedrückt hast.
    Und du weißt bestimmt auch, dass eine While-Schleife solange arbeitet, bis der Ausdruck im Kopf falsch (also "False") ist.
    Wenn nicht,... Schau dir Schleifen unbedingt nochmal an! Ansonsten kannst du weiter lesen.

    Jetzt kommen eigentlich nur noch die Timer Funktionen hinzu.
    TimerDiff() gibt dir dabei die verstrichende Zeit in Millisekunden zurück, seitdem die TimerInit() Funktion das letzte mal aufgerufen wurde.
    Da es in einen Programm schonmal mehrere TimerInit() Aufrufe geben kann, bekommst du von der TimerInit() Funktion eine Art ID.
    Diese speicherst du in einer Variable ab, damit die TimerDiff() Funktion weiß, welches TimerInit() du meinst.

    Kurzes Beispiel:

    [autoit]

    ; Versuch erst einmal das hier zu verstehen
    $hTOne = TimerInit()
    Sleep(1000)
    $hTTwo = TimerInit()
    Sleep(1000)
    ConsoleWrite(TimerDiff($hTTwo) & @CRLF)
    Sleep(1000)
    ConsoleWrite(TimerDiff($hTOne) & @CRLF)

    [/autoit]

    Nun kommen die Schleifen und _IsPressed() ins Spiel.
    Zuerst musst du ja ermitteln ob die gewünschte Taste gedrückt wurde.
    Also eine normale Abfrage:

    [autoit]

    If _IsPressed('20') Then
    ; Code
    EndIf

    [/autoit]

    Da du die Zeit messen möchtest fehlt dir also ein TimerInit() Aufruf:

    [autoit]

    If _IsPressed('20') Then
    $hTimer = TimerInit()
    EndIf

    [/autoit]

    Jetzt kommt dein eigentliches Problem. Du willst dass etwas ausgeführt wird, sobald die Leertaste länger als 0.3 Sekunden gedrückt wurde.
    Dafür musst du ja permament abfragen, ob die Leertaste schon losgelassen wurde.
    Das kannst du mit einer weiteren Schleife realisieren:

    [autoit]

    If _IsPressed('20') Then
    $hTimer = TimerInit()
    While _IsPressed('20') ; Solange ausführen wie Taste noch gedrückt ist
    WEnd
    EndIf

    [/autoit]

    Soa, baust du jetzt noch eine If-Abfrage ein, kannst du dann abfragen ob die Taste schon länger als 0.3 Sekunden gedrückt ist:

    [autoit]

    If _IsPressed('20') Then
    $hTimer = TimerInit()
    While _IsPressed('20')
    If TimerDiff($hTimer) >= 300 Then
    ; Code der ausgeführt werden soll
    ExitLoop
    EndIf
    WEnd
    EndIf

    [/autoit]

    Ist ja doch ein wenig lang geworden. Aber ich möchte dass du das auch verstehst und nicht nur Copy & Paste nutzt. ^^
    Falls noch Fragen da sind, kannst du gerne nachfragen! :)

  • Danke Make - Grafik. Das hast du sehr detailliert beschrieben. Ich glaube das habe ich jetzt verstaden. Werde es heute abend mal praktisch testen. Aber so sollte das Skript ja dann laufen:

    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
    #include <Misc.au3>
    Global $hTimer = TimerInit()
    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    If _IsPressed('20') Then
    $hTimer = TimerInit()
    While _IsPressed('20')
    If TimerDiff($hTimer) >= 300 Then
    ; Code der ausgeführt werden soll
    ExitLoop
    EndIf
    WEnd
    EndIf

    [/autoit]

    Jetzt aber noch eine Frage. Das Skript ist ja jetzt so dass es die Zeit zwischen drücken von Leertaste bis Loslassen Leertaste nimmt. Ist die Differenz größer 300 löst es aus.
    Wenn Jetzt aber gewollt ist das es auch ohne loslassen auslöst, wie geht das? Quasi ich drücke die Leertaste 0,2 Sekunden, nix passiert. Ich drücke Sie z.b. 5Sekunden, aber schon nach 0,3 Sekunden soll es auslösen. Quasi unabhängig davon wann ich sie loslasse.

    Hoffe meine Frage ist verständlich formuliert. Weil dann kann ja keine Differenz gebildet werden weil unklar ist wann ich die taste loslasse. Mann muss also vom drücken der taste messen und wenn 03, Sekunden vergangen sind, dann löse aus.

    könnte es so gehen?

    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
    #include <Misc.au3>
    Global $hTimer = TimerInit()
    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    If _IsPressed('20') Then
    $hTimer = TimerInit()
    While _TimerDiff($hTimer) >= 300
    ; Code der ausgeführt werden soll
    ExitLoop
    WEnd
    EndIf

    [/autoit]

    Einmal editiert, zuletzt von rexderruede (24. November 2014 um 10:55)

  • Genau das macht der codeschnipsel den ich dir da gegeben habe. Nach 300ms (egal ob Taste noch gedrückt ist oder nicht) wird der Code in der Abfrage ausgeführt. Danach wird die Schleife verlassen. :)

    Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2

  • @Make-Grafik:
    das ist echt eine super Erklärung.

    @rexderruede:
    ich lerne auch am besten so wie Du es beschrieben hast.
    so verstehe ich besser die Befehle und deren Nutzung.

    @Make-Grafik:
    meine abstrakten gedanken logisch und sinnvoll als quelltext zu verfassen,
    ist nicht imer leicht. es müssen erst einmal die abstrakten gedanken sortiert
    und in die richtigen bahnen geschoben werden. ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • So, nun hab ich nen Problem. Solange ich auch überlege, komme ich nicht weiter. Vom prinzip her funktioniert es, aber sehr unzuverlässig. Habe es in einer txt datei ausprobiert. Manchmal passiert halt gar nix beim druck auf leertaste. woran liegt es? an meiner hardware? hier mein code:

    [autoit]


    #include <Misc.au3> ; Binde die Misc.au3 ein( für _IsPressed)
    Global $hTimer = TimerInit()

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

    While (1)

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

    If _IsPressed("20") Then ;wenn lerrtaste gedrückt, dann

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

    sleep (Random (20, 30, 1))
    Send("{7}")
    Sleep (Random (20, 30, 1))
    Send("{8}")
    Sleep (Random (20, 30, 1))
    Send("{9}")
    Sleep (Random (20, 30, 1))

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

    EndIf

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

    If _IsPressed('20') Then

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

    sleep (Random (20, 30, 1))
    $hTimer = TimerInit()
    While _IsPressed('20')
    If TimerDiff($hTimer) >= 1000 Then
    Send('6')
    sleep (Random (20, 30, 1))
    ExitLoop
    EndIf
    WEnd

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

    EndIf

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

    WEnd ; Wiederholfe die Schleife

    [/autoit]

    Vielen dank schonmal vorab für die Hilfe

    2 Mal editiert, zuletzt von rexderruede (25. November 2014 um 20:30)

    • Offizieller Beitrag

    Lösung hätte ich, aber das geht deutlich über das hinaus, was z.B. _IsPressed bietet.
    Es ist sowieso keine glückliche Lösung, die Dauer eines Tastendruckes über _IsPressed erfassen zu wollen. Dazu nutzt man KeyEvents (Down, Up) und misst die Zeitspanne zwischen beiden.

    Problem: Wie das geht werden wir hier nicht offen aufzeigen, da es dann nur noch ein kleiner Schritt bis zum Keylogger ist.Aber wenn du dir die Funktion _IsPressed im Include mal anschaust und dann mit den dort gefundenen Inhalten etwas googelst wirst du auch heraus finden, wie der weitere Weg sein sollte.

  • Hallo.

    Ich weiß jetzt nicht, ob ich dich richtig verstanden habe, aber evtl. so:

    Spoiler anzeigen
    [autoit]


    #include <Misc.au3> ; Binde die Misc.au3 ein( für _IsPressed)
    Global $hTimer = TimerInit()

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

    While (1)

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

    If _IsPressed("20") Then ;wenn lerrtaste gedrückt, dann

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

    sleep (Random (40, 50, 1))
    Send("{7}")
    sleep (Random (40, 50, 1))
    Send("{8}")
    sleep (Random (40, 50, 1))
    Send("{9}")
    sleep (Random (40, 50, 1))
    $hTimer = TimerInit()
    While _IsPressed('20')
    If TimerDiff($hTimer) >= 1000 Then
    Send('6')
    sleep (Random (40, 50, 1))
    ExitLoop
    EndIf
    WEnd

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

    EndIf

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

    WEnd ; Wiederholfe die Schleife

    [/autoit]

    Ergebnis bei mir alle 1000 ms kommt die "6-er Schleife" ansonsten die "789-er Schleife":

    Spoiler anzeigen
    [autoit]


    789 6 789 6 789 6 789 6 789 6 789 6 789

    [/autoit]

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl