Nach GetAsyncKeyState_ Keyboardpuffer leeren?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Morty
Beiträge: 268
Registriert: 22.10.2004 07:20
Wohnort: Erfurt
Kontaktdaten:

Nach GetAsyncKeyState_ Keyboardpuffer leeren?

Beitrag von Morty »

Guten Morgen.

Also mein Problem ist folgendes:
Ich arbeite in einer Anwendung mit

Code: Alles auswählen

GetAsyncKeyState_(#VK_ESCAPE)
um Elemente weiter zu schalten. Leider reagiert er aber x-mal auf einen Tastendruck, so dass es mir nicht möglich ist, nur ein Element weiter zu schalten.
auch

Code: Alles auswählen

GetKeyState_()
liefert das gleiche Problem.

Deshalb kam mir die Idee, den Keyboardpuffer irgendwie zu leeren (kann mich erinnern, sowas in anderen Sprachen schonmal gesehen zu haben). Leider hab ich in der MSDN nichts passendes gefunden.
Ich hoffe einer von euch kann mir weiter helfen.

Danke

Morty
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Nach GetAsyncKeyState_ Keyboardpuffer leeren?

Beitrag von Kiffi »

> Leider reagiert er aber x-mal auf einen Tastendruck, so dass es mir nicht
> möglich ist, nur ein Element weiter zu schalten.

so sollte es gehen:

Code: Alles auswählen

Repeat
  If GetAsyncKeyState_(#VK_ESCAPE)
    Debug "ESC"
    While GetAsyncKeyState_(#VK_ESCAPE) <> 0
      Delay(0)
    Wend
  EndIf
ForEver
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Morty
Beiträge: 268
Registriert: 22.10.2004 07:20
Wohnort: Erfurt
Kontaktdaten:

Beitrag von Morty »

Danke, funktioniert super.

Da stand ich wohl ein bissl auf'm Schlauch :freak:

Mein Problem sehe ich damit gelöst, wäre aber trotzdem interessant zu wissen ob's ne Möglichkeit gibt, den Keyboardpuffer zu leeren?

Morty
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ermn..

das ding arbeitet nicht mit keyboardpuffer, sondern gibt den momentanen status zurück, d.h. solange die taste gedrückt ist, liefert die abfrage den gedrückt-status, sooft halt in der zeit die schleife durchlaufen wird.
Kiffi hat hier die einfachste lösung angeboten: warten, bis taste wieder losgelassen.

wenn du in der zwischenzeit noch etwas anderes machen willst, also, keine warteschleife benutzen kannst wie Kiffis beispiel, musst du mit flags arbeiten:

Code: Alles auswählen

; - Hauptschleife Anfang
...
; irgendwo drin

; Tastenabfrage
   If GetAsyncKeyState_(#VK_ESCAPE) And EscAct = 0
      EscAct = 1

      ; das was passieren soll, wenn Esc gedrückt wird

   EndIf
   If GetAsyncKeyState_(#VK_ESCAPE) = 0
      EscAct = 0
   EndIf
...
; - Hauptschleife Ende
durch das Flag wird sichergestellt, dass die aktion genau einmal pro tastendruck ausgeführt wird.
wie gesagt, dass ist nur nötig, wenn deine schleife kontinuierlich laufen muss, sonst kannst du auch einfach aufs loslassen warten wie von Kiffi vorgeschlagen.
Zuletzt geändert von Kaeru Gaman am 30.06.2006 13:44, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@KG
kleiner fehler:

If GetAsyncKeyState_(#VK_ESCAPE) = 0

statt

If GetAsyncKeyState_(#VK_ESCAPE) <> 0

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ach, thnx.. denkfehler.. hatte es grad bei Kiffi rausgepatcht... >__<"

ist editiert.

-------------------
PS:
ergänzende anmerkung:
die ifs müssen getrennt sein, wegen das AND in der bedingung. wer lieber mit ELSE arbeitet, muss die Flagprüfung separieren:

Code: Alles auswählen

; - Hauptschleife Anfang
...
; irgendwo drin

; Tastenabfrage
   If GetAsyncKeyState_(#VK_ESCAPE)
      If EscAct = 0
         EscAct = 1

         ; das was passieren soll, wenn Esc gedrückt wird

      EndIf
   Else
      EscAct = 0
   EndIf
...
; - Hauptschleife Ende
hierbei könnte man es als vorteil ansehen, dass die API nur einmal angesprochen werden muss -> performance
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten