![]() |
Tastaturpuffer leeren
Hallo !
Ich habe ein Problem: mein Tastaturpuffer wird voll. Wie kann man den entleeren ? Ich bin also mal auf die Funktion ClearEventLog (oder so ähnlich) gestoßen. Hat die was damit zu tun ? Wenn ja, dann würd' ich gern wissen, welches File ich angeben soll. :gruebel: |
Re: Tastaturpuffer leeren
schau dir mal folgendes an, da wird auch ein key aus dem tastaturbuffer geschmissen
![]() |
Re: Tastaturpuffer leeren
Zitat:
Wie darf ich das verstehen? Zitat:
|
Re: Tastaturpuffer leeren
Zitat:
Desweiteren werden während des Prozesses Tastendrücke verlangt/erwartet. So wird der Tastaturpuffer (auf meinem Laptop zumindest) releativ schnell voll. Zitat:
|
Re: Tastaturpuffer leeren
Dann würde ich mal dafür sorgen, dass die Tasteneingaben für deine Anwendung während dieses Prozesses verarbeitet werden. Bzw. warum machst du welche, wenn du weißt, dass sie doch niocht ankommen? Mach es dem Bwenutzer deutlich, dass er erst warten muss bis der Prozess im Programm fertig ist, bevor er damit weiterarbeiten kann.
|
Re: Tastaturpuffer leeren
Zitat:
Naja, aber hauptsache ich habe die Lösung meines Problems. Mit PeekMessage kann ich - so weit ich das sehen kann - alle Messages abfangen und gegebenenfalls löschen. |
Re: Tastaturpuffer leeren
Und wa shat das für ein Sinn wenn der User 10 mal drückt und du löscht 9 Eingaben?
|
Re: Tastaturpuffer leeren
Ich hab' den Code zwar nicht parat, aber ich hab' das schon getestet. Und zwar habe ich eine Routine erstellt (Endlosschleife), die ständig Keys sendet. Nach sehr kurzer Zeit ist der Buffer überfüllt. Wenn ich aber nach jedem Senden eines Keys PeekMessage(...,pm_remove); aufrufe, erhalte ich einige Minuten lang keine Rückmeldung vom dem Buffer.
Außerdem fragt das Spiel mit Hilfe der API-Funktion GetAsyncKeyState die Tasten ab, in den Tastaturpuffer wird (soweit ich das überblicke) aber nach einem bestimmten Wiederholungsinterval ein neues Zeichen geschrieben. Die Frequenz meiner Schleife ist jedoch wesentlich höher als die der Tastenwiederholung. |
Re: Tastaturpuffer leeren
Ich kann dein Problemm wircklich nicht nachvollziehen. Die Tastaturpuffer wird sowieso automatisch "entladen", es sei denn, du hast die WM_XXX Nachrichten selbst behandelt und dabei etwas falsch gemacht. Am sonsten, sollte dein Speil immer eine Schleife durchlaufen etwas so:
Delphi-Quellcode:
, dann ist es noch besser gar keine WM_KEYXXX oder WM_CHARXX Nachrichten überhaupt selbst zu behandeln, sondern diese lässt du DefWndProc behandeln. Mit GetAsyncKeyState kommt man dann weiter, beim jeder Durchlauf überprüft man gewünschte Tasten, z.B. so:
while (not finished) do
begin // spiel end;
Delphi-Quellcode:
EDIT: Habe den letzten Beitrag übersehen, :roll: .
if Hi(GetAsyncKeyState(VK_ESCAPE))=128 then // ESC wurde gedruckt....
|
Re: Tastaturpuffer leeren
So ähnliches wollte ich auch gerade schreiben. Möglicherweise gibt es in deinem Programmcode
eine Stelle (Schleife While oder For oä.) was dein Programm "blockiert" und die Tastatureingabe nicht abarbeitet. Eine Application.ProcessMessages könnte in diesem Falle helfen.
Delphi-Quellcode:
function KeyPressed: Integer;
var i: Integer; buf: TKeyboardState; begin Result := -1; if GetKeyboardState(buf) then for i := 0 to High(buf) do if (buf[i] and $80)<>0 then begin Result := i; Exit; end; end; procedure TFormX.Steuerung... begin repeat case KeyPressed of VK_UP: ; VK_DOWN: ; VK_LEFT: ; VK_RIGHT: ; end; Application.ProcessMessages; until KeyPressed = VK_ESCAPE; end; |
Re: Tastaturpuffer leeren
Hallo,
warum helft ihr ihm nicht einfach? Was soll dieses rumdiskutieren? Vielleicht ist es auch für andere Anwendungen sinnvoll den Tastaturbuffer zu leeren. Rainer |
Re: Tastaturpuffer leeren
Wie kann ich denn den Tastaturpuffer leeren ?
![]() Siehe auch: ![]() |
Re: Tastaturpuffer leeren
Na also,
geht scheinbar doch ohne unnötige Diskussion. Rainer |
Re: Tastaturpuffer leeren
@runger, aber ob das Cicaro so von Nutzen ist ist eine andere Frage.
:gruebel: Ich habe es noch nicht geschaft einen Tastaturpuffer zum überlaufen zu bringen :stupid:, deshalb würde es mich Interessieren wie das bei Cicaro sein kann. |
Re: Tastaturpuffer leeren
Zitat:
Delphi-Quellcode:
Und ? Ist er übergelaufen ? :-D
repeat
Keybd_Event(48,0,0,0); // Sendet ein Zeichen ('0') until GetAsyncKeyState(27)<0; // Esc zum Abbrush |
Re: Tastaturpuffer leeren
Zitat:
|
Re: Tastaturpuffer leeren
Zitat:
des weiteren kann ich nur zustimmen dass die lösung mit erst tastaturpuffer durch selbst gesendete messages volllaufen lassen und dann wieder leeren ja wohl nicht das wahre sein kann. im allgemeinem musste ich mich noch nie um meinen "tastaturpuffer" kümmern (ausser mit dem guten alten DOS). es soll hier auch noch gesagt sein dass es eigentlich einen puren tastaturpuffer gar nicht gibt. immer wenn eine taste gedrückt wird wird eine message an das aktive fenster gesendet, und die wird, wenn noch andere messages anstehen, einfach hinter den anderen messages eingereiht, also z.b. auch hinter messages für mausbewegungen etc. und dass sich so ein "Messagestau" bildet kann eigentlich nur passieren wenn du in einer schleife die ganze zeit rackerst und die messages nicht zwischendurch mit Application.Processmessages abarbeiten lässt. und das sollte man tunlichst vermeiden, da das dann aussieht, als würde die anwendung hängen beleiben, da du z.b. auch nciht mehr das fenster resizen kannst. auch ja und ich denke mal das der code zum tastaturpuffer leeren die gesamte messagequeue löscht, d.h. auch alle messages bezüglich mausbewegungen etc., und ich weiss ja nicht ob es das ist was du möchtest. |
Re: Tastaturpuffer leeren
Also eigentlich hab' ich ja die Lösung meines Problems schon bekommen (PeekMessage). Doch die Diskussion find' ich auch interessant. Ich werd' mir noch Application.Processmessages anschauen.
Kleine Entschuldigung für den Code: Keine Ahnung warum aber jetzt funktioníert es auch bei mir nicht. :gruebel: Hm, ... gestern hab' ich C: formatiert und das System noch mal raufgejagt. Aber davor funktionierte es. Wirklich! :gruebel: @BlackJack: meinst du wirklich, die Mausbewegungen werden als Messages in die Schlange der nicht-verarbeiteten Messages gestellt ? Meiner Meinung nach werden sie vom System über Interrupts ermittelt und verarbeitet. Das gilt auch für die Tastatur. Zusätzlich dazu (wenn es erforderlich ist, z.B.: wenn die Maus über ein Formular bewegt wird oder der Tastendruck an ein Control oder ähnliches addressiert ist) sendet das System ihre Messages an die Formulare. Und genau die gilt es zu löschen. Korrigiert mich, wenn ich mich irre ! |
Re: Tastaturpuffer leeren
Zitat:
von daher rate ich dringenst davon ab, einfach ständig die message-warteschleife zu löschen. |
Re: Tastaturpuffer leeren
Delphi-Quellcode:
TApplication.ProcessMessages macht auch nix anderes.
procedure ProcessMessages(HWND: DWORD);
var Msg: TMsg; begin While PeekMessage(Msg, HWND, 0, 0, PM_REMOVE) do // Nachrichten abfragen und Verarbeiten.. begin TranslateMessage(Msg); // umwandeln der Virtual-Key Messages zu Character Messages DispatchMessage(Msg); // Messagesr Verarbeiten end; end; ...den Rest hat BlackJack beantwortet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz