我使用一个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的新版本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top