Seite 1 von 1
Maus/ Tastaturpuffer löschen
Verfasst: 06.06.2006 11:50
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!
Verfasst: 06.06.2006 13:14
von Kaeru Gaman
im screen:
ExamineKeyboard ermittelt einen momentanzustand.
einen Tastaturpuffer müsstest du dir selber schreiben.
in windows:
k.p.
Verfasst: 06.06.2006 20:20
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...
Verfasst: 06.06.2006 20:32
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.
Verfasst: 07.06.2006 04:38
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.
Verfasst: 10.08.2006 21:15
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

Verfasst: 10.08.2006 21:31
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.
Verfasst: 11.08.2006 12:36
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.

Danke nochmals
Verfasst: 11.08.2006 12:49
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.
Verfasst: 11.08.2006 13:19
von Xenos
Hmm.... ich hab das mal ausprobiert und es läuft tatsächlich besser, als mit der Warteschleife, meiner Meinung nach.
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)