Delphi:如何停止TAction快捷键的自动重复?

3

我正在使用Delphi TActionList,并为某些操作设置了快捷键。

我想防止某些操作被键盘自动重复触发多次,但我不希望全局影响自动重复操作。有什么最好的方法来实现这一点?

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

3个回答

12

拦截 WM_KEYDOWN 消息,并查看第30位,以确定是否自动重复。如果是,则不像通常那样传递该消息,从而使其不可见。

您可能需要启用表单键预览功能才能使其正常工作。


1

您可以放弃使用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中禁用计时器。


不完全是我想要的。用户仍然需要能够快速连续地按下键,但自动重复的击键必须被忽略。 - Roddy

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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接