Delphi-PRAXiS

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;

runger 12. Jul 2005 10:17

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

turboPASCAL 12. Jul 2005 11:16

Re: Tastaturpuffer leeren
 
Wie kann ich denn den Tastaturpuffer leeren ? function ClearKeyboardBuffer:Integer;

Siehe auch: http://www.swissdelphicenter.ch/de/showcode.php?id=1066

runger 12. Jul 2005 12:29

Re: Tastaturpuffer leeren
 
Na also,

geht scheinbar doch ohne unnötige Diskussion.

Rainer

turboPASCAL 12. Jul 2005 12:44

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.

Cicaro 21. Jul 2005 20:14

Re: Tastaturpuffer leeren
 
Zitat:

Zitat von turboPASCAL
@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.

Führ' mal den Code hier aus!
Delphi-Quellcode:
repeat
  Keybd_Event(48,0,0,0); // Sendet ein Zeichen ('0')
until GetAsyncKeyState(27)<0; // Esc zum Abbrush
Und ? Ist er übergelaufen ? :-D

turboPASCAL 21. Jul 2005 20:20

Re: Tastaturpuffer leeren
 
Zitat:

Zitat von Cicaro
Und ? Ist er übergelaufen ? :-D

:gruebel: Sowas mach ich doch nicht freiwillig :lol:

BlackJack 22. Jul 2005 09:54

Re: Tastaturpuffer leeren
 
Zitat:

Zitat von Cicaro
Führ' mal den Code hier aus!
Delphi-Quellcode:
repeat
  Keybd_Event(48,0,0,0); // Sendet ein Zeichen ('0')
until GetAsyncKeyState(27)<0; // Esc zum Abbrush
Und ? Ist er übergelaufen ? :-D

sorry, da passiert bei mir überhaupt nichts - nur das hauptprogramm bleibt stehen - und das ist ja auch klar weil er in der schleife feststeckt. wenn man da ein Application.Processmessages reinmacht passiert dann wirklich gar nichts, man kann ganz normal weiter machen... so what...

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.

Cicaro 22. Jul 2005 16:00

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 !

BlackJack 22. Jul 2005 16:10

Re: Tastaturpuffer leeren
 
Zitat:

Zitat von Cicaro
@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.

klar verarbeitet das system die mausbewegungen direkt (sonst könne man ja z.b. über einem hängen gebliebenen fenster nicht die maus bewegen), aber das system schcickt dann gleichzeitig auch nachrichten an das fenster, dass sich z.b. die maus dadrüber bewegt oder geklickt hat. und wenn diese messages auch gelöscht werden würden könntest du z.b. OnMouseMove oder OnClick nicht mehr benutzen.

von daher rate ich dringenst davon ab, einfach ständig die message-warteschleife zu löschen.

turboPASCAL 22. Jul 2005 17:11

Re: Tastaturpuffer leeren
 
Delphi-Quellcode:
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;
TApplication.ProcessMessages macht auch nix anderes.

...den Rest hat BlackJack beantwortet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:33 Uhr.

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