Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Tastaturpuffer leeren (https://www.delphipraxis.net/49307-tastaturpuffer-leeren.html)

Cicaro 8. Jul 2005 17:50


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:

SirThornberry 8. Jul 2005 17:55

Re: Tastaturpuffer leeren
 
schau dir mal folgendes an, da wird auch ein key aus dem tastaturbuffer geschmissen
http://www.delphipraxis.net/internal...=208058#208058

Luckie 8. Jul 2005 17:57

Re: Tastaturpuffer leeren
 
Zitat:

Zitat von Cicaro
Ich habe ein Problem: mein Tastaturpuffer wird voll.

Ähm. :shock:
Wie darf ich das verstehen?
Zitat:

Wie kann man den entleeren ?
Ich hatte noch nie das Bedürfniss den Tastaturbuffer zu leeren und sehe auch keinen Sinn darin.

Cicaro 8. Jul 2005 18:14

Re: Tastaturpuffer leeren
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Cicaro
Ich habe ein Problem: mein Tastaturpuffer wird voll.

Ähm. :shock:
Wie darf ich das verstehen?

Ich habe einen 'scheinbar' endlosen Prozess, den der Taskmanager mit "reagiert nicht" markiert.
Desweiteren werden während des Prozesses Tastendrücke verlangt/erwartet. So wird der Tastaturpuffer (auf meinem Laptop zumindest) releativ schnell voll.
Zitat:

Zitat:

Wie kann man den entleeren ?
Ich hatte noch nie das Bedürfniss den Tastaturbuffer zu leeren und sehe auch keinen Sinn darin.
Aber spätestens dann, wenn es anfängt zu piepen! :-D

Luckie 8. Jul 2005 18:17

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.

Cicaro 12. Jul 2005 07:51

Re: Tastaturpuffer leeren
 
Zitat:

Zitat von Luckie
Mach es dem Bwenutzer deutlich, dass er erst warten muss bis der Prozess im Programm fertig ist, bevor er damit weiterarbeiten kann.

"Hallo, lieber user meines Spiels. Du darfst, während das Spiel läuft, keine Tastatureingaben machen, obwohl das Spiel nur über die Tastatur bedient werden kann." :lol:

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.

Luckie 12. Jul 2005 07:55

Re: Tastaturpuffer leeren
 
Und wa shat das für ein Sinn wenn der User 10 mal drückt und du löscht 9 Eingaben?

Cicaro 12. Jul 2005 09:15

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.

sniper_w 12. Jul 2005 09:19

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:
while (not finished) do
begin
// spiel
end;
, 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:
Delphi-Quellcode:
 if Hi(GetAsyncKeyState(VK_ESCAPE))=128 then // ESC wurde gedruckt....
EDIT: Habe den letzten Beitrag übersehen, :roll: .

turboPASCAL 12. Jul 2005 09:44

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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:55 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2018 by Daniel R. Wolf