3

我正在使用 Delphi TActionList,其中包含一些操作的快捷键。

我想防止某些操作被键盘自动重复多次触发,但我不想影响全局的自动重复操作。这样做的最佳方法是什么?

澄清:我仍然需要处理多个快速按键 -我只想忽略自动重复生成的按键。

4

3 回答 3

12

拦截WM_KEYDOWN消息,并查看第 30 位,看它是否在自动重复。如果是,请不要像往常一样传递消息,它不会被看到。

您可能需要启用表单密钥预览才能完成这项工作。

于 2009-02-02T16:27:21.180 回答
1

您可以删除 TTimer,将 TTimer.Interval 设置为您想要的值(1000 = 1 秒),然后在 TAc​​tionList 中执行以下操作:

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中禁用计时器。

于 2009-02-02T15:36:18.677 回答
0

您可以保存上次使用某个操作的时间,如果两者之间的时间太短,则忽略它。对于单个操作,您可以执行以下操作:

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。

于 2009-02-03T08:48:56.503 回答