Maus/ Tastaturpuffer löschen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xenos
Beiträge: 114
Registriert: 24.01.2006 20:33
Wohnort: Dresden(hin und wieder)
Kontaktdaten:

Maus/ Tastaturpuffer löschen

Beitrag von Xenos »

Gibt es eigentlich einen Befehl in PB, mit dem man den Mauspuffer bzw. den Tastaturpuffer wieder leer machen kann?

Ähnlich den Befehlen FlushMouse() oder FlushKeyboard() aus BlitzBasic?

Die Suchfunktion brachte keine Einträge darüber und die WinAPI- Doku schweigt sich auch aus.

Wer Ansätze für einen Alghorithmus kennt oder einen Link, bitte posten!

thx, Leute!
gô ni itte wa gô ni shitagae.
(Wenn du in ein Dorf kommst, richte dich nach seinen Gepflogenheiten - jap. Sprichwort.)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

im screen:
ExamineKeyboard ermittelt einen momentanzustand.
einen Tastaturpuffer müsstest du dir selber schreiben.

in windows:
k.p.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xenos
Beiträge: 114
Registriert: 24.01.2006 20:33
Wohnort: Dresden(hin und wieder)
Kontaktdaten:

Beitrag von Xenos »

Naja, die Sache ist die: Ich frage im Rahmen eines Programms die Maus ab, woraufhim man in so eine Art Zeichenmodus kommt und dann mit der Maus auf dem Bildschirm rummalen kann. Blöderweise habe ich jedesmal, wo ich auf den Selfmadebutton geklickt habe auch schon einen Punkt auf den Bildschirm gemalt.

Allerdings hat bisher auch kein zweimaliges ExamineMouse() geholfen...
gô ni itte wa gô ni shitagae.
(Wenn du in ein Dorf kommst, richte dich nach seinen Gepflogenheiten - jap. Sprichwort.)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Nachdem du auf den Button geklickt hast, kannst du doch mit einer Schleife warten, bis die Maustaste wieder losgelassen wurde, oder?
Einfacher gehts mit der API, aber du kannst es vom Sinn her auch umschreiben mit PB-Befehlen:

Code: Alles auswählen

; Button wurde geklickt

Repeat : Delay(1) : Until GetAsyncKeystate_(#VK_LBUTTON) = 0
While GetAsyncKeystate_(#VK_LBUTTON) : Delay(1) : Wend

; Hier bei erneutem Druck malen oder ein Eis backen...
Es wird solange das Delay repeated, bis die Linke Maustaste losgelassen wurde; die API Funktion dort gibt dann null zurück. Die 2. Schleife mit While habe ich drunter geschrieben, als alternative, die fiel mir hinterher ein (ist eleganter); es ist aber egal welche Methode du Benutzt. Haken: Dieser Code funktioniert nur unter Windows. Das Delay ist dazu da, damit der Computer nicht allzustark ausgelastet wird, wenn die chleife solange wiederholt wird.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Allerdings hat bisher auch kein zweimaliges ExamineMouse() geholfen...

also arbeitest du mit nem screen?

die lösung die AND51 vorgeschlagen hat, kannst du auch mit dem PB-Befehl MouseButton() durchführen.

wichtig ist: warten bis wieder losgelassen.

auch bei abfrage von ESC ist sowas wichtig, wenn ESC ein untermenu verlässt, und danach auch das Hauptmenu verlassen kann.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xenos
Beiträge: 114
Registriert: 24.01.2006 20:33
Wohnort: Dresden(hin und wieder)
Kontaktdaten:

Beitrag von Xenos »

Danke, das hilft mir enorm weiter.
Nur unter Windows, ist immer noch besser als gar nicht...
Aber findet sich auch ein Linux oder MAC Progger, der dafür ne Lösung parat hat.
Und ja, ich arbeite mit nem Screen, gut kombiniert Watson :allright:
gô ni itte wa gô ni shitagae.
(Wenn du in ein Dorf kommst, richte dich nach seinen Gepflogenheiten - jap. Sprichwort.)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

wie ich oben schon schrieb

> die lösung die AND51 vorgeschlagen hat, kannst du auch mit dem PB-Befehl MouseButton() durchführen.

also, selbe vorgehensweise, nur statt des API-Calls die PB-Interne funktion verwenden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xenos
Beiträge: 114
Registriert: 24.01.2006 20:33
Wohnort: Dresden(hin und wieder)
Kontaktdaten:

Beitrag von Xenos »

Stimmt... Sorry, da hatte ich ein echtes Brett vorm Wald und den Kopf vor lauter Bäumen nicht gesehen oder wie das heißt. :oops:
Danke nochmals
gô ni itte wa gô ni shitagae.
(Wenn du in ein Dorf kommst, richte dich nach seinen Gepflogenheiten - jap. Sprichwort.)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du kannst statt mit einer warteschleife auch mit flags arbeiten...

Code: Alles auswählen

; ---- innerhalb der Hauptschleife ----

MB = 0
If MouseButton(1)
  If MBOld = 0
    MB = 1
    MBOld = 1
  EndIf
Else
  MBOld = 0
EndIf
MB liefert nur beim ersten Hauptschleifendurchgang den Mausklick,
wenn man den Button noch weitere Hauptschleifendurchgänge gedrückt hält,
bleibt MB = 0, erst wenn man den Button wieder losläßt, kann man erneut drücken,
und MB wird wieder =1 für genau einen Durchgang.

ich persönlich ziehe flags vor.
warteschleifen innerhalb von hauptschleifen, die das komplette timing stören können, sind in meinen augen schlechter programmier-stil.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xenos
Beiträge: 114
Registriert: 24.01.2006 20:33
Wohnort: Dresden(hin und wieder)
Kontaktdaten:

Beitrag von Xenos »

Hmm.... ich hab das mal ausprobiert und es läuft tatsächlich besser, als mit der Warteschleife, meiner Meinung nach.:D
Die Idee mit den Flags war mir früher schon in ähnlicher Form gekommen, hat aber damals nicht hingehauen... (frag nicht warum, ich lerne noch)
gô ni itte wa gô ni shitagae.
(Wenn du in ein Dorf kommst, richte dich nach seinen Gepflogenheiten - jap. Sprichwort.)
Antworten