【问题标题】:Delphi: How do I stop TAction shortcut keys autorepeating?Delphi:如何停止 TAction 快捷键自动重复?
【发布时间】:2010-10-04 22:47:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: delphi keyboard autorepeat taction


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以删除 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 中禁用计时器。

      【讨论】:

      • 不是我想要的。用户可以连续快速敲击按键仍然很重要,但必须忽略自动重复笔划。
      【解决方案3】:

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

      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。

      【讨论】:

        猜你喜欢
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 2011-11-17
        • 1970-01-01
        • 2011-11-10
        • 2012-11-19
        • 1970-01-01
        相关资源
        最近更新 更多