Delphi: Wie kann ich TAction Shortcut-Tasten autorepeating stoppen?
-
20-08-2019 - |
Frage
Ich bin mit einem Delphi TActionList, mit Shortcut-Tasten für einige Aktionen.
Ich möchte von bestimmten Aktionen verhindern, dass sie mehrmals durch Tastatur Auto-Repeat ausgelöst wird, aber ich weiß nicht wollen global Auto-Repeat-Betrieb beeinflussen. Was ist der beste Weg, dies zu tun?
Klarstellung : Ich muß noch mehr schnellen Drücken von Tasten handhaben - es ist nur die erzeugten Drücken von Tasten durch Auto-Repeat, die ich will ignorieren.
Lösung
Intercept WM_KEYDOWN Nachrichten und schauen bei Bit 30, um zu sehen, ob es auto-Wiederholungs ist. Wenn ja, kann passieren einfach nicht auf die Nachricht wie gewohnt, und es wird nicht zu sehen.
Sie können benötigen Form Schlüssel-Vorschau zu aktivieren, um diese Arbeit zu machen.
Andere Tipps
Sie können TTimer fallen, setzen TTimer.Interval zu schätzen Sie wollen (1000 = 1 s), dann in TActionList so etwas wie:
procedure TfrmMain.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
begin
if Timer1.Enabled then
begin
Handled := True;
Exit;
end;
Handled := false;
Timer1.Enabled := true;
end;
Vergessen Sie auch nicht Timer in deaktivieren Timer.OnTimer .
Sie können die letzte Zeit sparen eine Aktion verwendet wird, und es ignorieren, wenn die Zeit dazwischen zu kurz ist. Für eine einzelne Aktion können Sie tun:
procedure TForm.FormCreate(const Sender: TObject);
begin
// ...
FLastActionTime := Now; //
end;
proceudure TForm.Action1Execute(const Sender: TObject);
const
cThreshold = 1/(24*60*60*10); // 0.1 sec
begin
if Now-FLastActionTime<cThreshold then
Exit; // Ignore two actions within 0.1 sec
FLastActionTime := Now;
end;
Sie können dies kombinieren mit der Lösung von dmajkic ein allgemeineres aproach zu bekommen. Und wenn Sie wirklich ehrgeizig sind, können Sie eine neue Version von TAction / TActionList erstellen.