我正在使用 Delphi TActionList,其中包含一些操作的快捷键。
我想防止某些操作被键盘自动重复多次触发,但我不想影响全局的自动重复操作。这样做的最佳方法是什么?
澄清:我仍然需要处理多个快速按键 -我只想忽略自动重复生成的按键。
我正在使用 Delphi TActionList,其中包含一些操作的快捷键。
我想防止某些操作被键盘自动重复多次触发,但我不想影响全局的自动重复操作。这样做的最佳方法是什么?
澄清:我仍然需要处理多个快速按键 -我只想忽略自动重复生成的按键。
拦截WM_KEYDOWN消息,并查看第 30 位,看它是否在自动重复。如果是,请不要像往常一样传递消息,它不会被看到。
您可能需要启用表单密钥预览才能完成这项工作。
您可以删除 TTimer,将 TTimer.Interval 设置为您想要的值(1000 = 1 秒),然后在 TActionList 中执行以下操作:
procedure TfrmMain.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
begin
if Timer1.Enabled then
begin
Handled := True;
Exit;
end;
Handled := false;
Timer1.Enabled := true;
end;
也不要忘记在Timer.OnTimer中禁用计时器。
您可以保存上次使用某个操作的时间,如果两者之间的时间太短,则忽略它。对于单个操作,您可以执行以下操作:
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;
您可以将其与 dmajkic 的解决方案结合使用,以获得更通用的方法。如果你真的有野心,你可以创建一个新版本的 TAction/TActionlist。