Ist das wirklich der Tastaturpuffer? Oder nicht vielleicht eher der Message-Queue?
Das hier sollte alle Tastatur-Messages im Queue löschen:
Delphi-Quellcode:
procedure TfrmMain.ClearKeyboardMessages;
var
Msg: TMsg;
begin
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE or (QS_KEY shl 16)) do
begin
// Normalerweise:
// TranslateMessage(Msg);
// DispatchMessage(Msg);
// Aber da wir die Messages ignorieren, tun wir einfach nix
end;
end;
Ist ungetestet, aber der Code ist nur minimal aus einer ähnlichen, funktionierenden Prozedur abgewandelt.
Mit PeekMessage gehen aber auch noch andere coole Sachen, z.B. kannst du gucken, ob irgendwo später im Message-Queue die Escape-Taste auftaucht, und dann abbrechen – ohne, dass der ganze Message-Queue dabei draufgeht.
MSDN hat ein Beispiel, das ziemlich genau dein Problem abbildet.
Zitat:
Occasionally, an application needs to examine the contents of a thread's message queue from outside the thread's message loop. For example, if an application's window procedure performs a lengthy drawing operation, you may want the user to be able to interrupt the operation.
(Ich bin mir gerade nicht sicher, ob du nicht der warst, der in einem anderen Thread geschrieben hatte, dass er kein Englisch kann, daher mal kurz eine deutsche Übersetzung: „Manchmal muss eine Anwendung von außerhalb der Message-Loop eines Threads die Inhalte von dessen Message-Queue untersuchen. Wenn zum Beispiel die Fenster-Routine einer Anwendung eine längere Zeichen-Operation ausführt, willst du dem User u.u. die Möglichkeit geben, die Operation unterbrechen.“)