【发布时间】:2010-10-04 22:47:32
【问题描述】:
我正在使用 Delphi TActionList,其中包含用于某些操作的快捷键。
我想防止某些操作被键盘自动重复多次触发,但我确实不想影响全局的自动重复操作。这样做的最佳方法是什么?
澄清:我仍然需要处理多个快速按键 - 只有我想忽略自动重复生成的按键。
【问题讨论】:
标签: delphi keyboard autorepeat taction
我正在使用 Delphi TActionList,其中包含用于某些操作的快捷键。
我想防止某些操作被键盘自动重复多次触发,但我确实不想影响全局的自动重复操作。这样做的最佳方法是什么?
澄清:我仍然需要处理多个快速按键 - 只有我想忽略自动重复生成的按键。
【问题讨论】:
标签: delphi keyboard autorepeat taction
拦截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。
【讨论】: