You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi实现勾选Hold后热键单次触发重复执行至再次按下的代码方案

Delphi实现热键单次触发持续执行功能

需求说明

原本按下并释放键仅执行一次对应动作,现在需要实现:当勾选"Hold"复选框时,按下并释放键后持续重复执行动作,直到再次按下键停止;未勾选时保持原单次执行逻辑。现有热键绑定的lka_Skip函数逻辑已正常运行,需基于此修改。

实现步骤与代码

1. 添加状态变量与定时器

在你的窗体或类的私有声明部分,新增用于标记持续状态的变量和定时器:

private
  fIsSkipHolding: Boolean; // 标记是否处于持续执行模式
  fSkipTimer: TTimer;      // 用于重复执行动作的定时器

2. 初始化定时器

在窗体创建事件(如FormCreate)中初始化定时器,设置执行间隔并绑定事件:

procedure TYourForm.FormCreate(Sender: TObject);
begin
  fSkipTimer := TTimer.Create(nil);
  fSkipTimer.Interval := 50; // 调整重复执行的间隔(单位:毫秒)
  fSkipTimer.OnTimer := SkipTimerOnTimer;
  fSkipTimer.Enabled := False; // 默认不启用
end;

3. 编写定时器执行逻辑

将原lka_Skip中的核心动作逻辑移到定时器事件中,实现重复执行:

procedure TYourForm.SkipTimerOnTimer(Sender: TObject);
begin
  // 复用原lka_Skip的核心执行逻辑
  if Game.Playing then
  begin
    if func.Modifier < 0 then
    begin
      if GameParams.NoAutoReplayMode then Game.CancelReplayAfterSkip := true;
      if CurrentIteration > (func.Modifier * -1) then
        GotoSaveState(CurrentIteration + func.Modifier)
      else
        GotoSaveState(0);
    end
    else if func.Modifier > 1 then
    begin
      fHyperSpeedTarget := CurrentIteration + func.Modifier;
    end
    else
    begin
      if fGameSpeed = gspPause then fForceUpdateOneFrame := true;
    end;
  end;
end;

4. 修改热键触发逻辑

更新lka_Skip的处理分支,根据"Hold"复选框状态切换执行模式:

lka_Skip:
begin
  if chkHoldSkip.Checked then // 假设"Hold"复选框名为chkHoldSkip
  begin
    // 切换持续执行状态
    fIsSkipHolding := not fIsSkipHolding;
    fSkipTimer.Enabled := fIsSkipHolding;
    
    // 可选:停止时的收尾逻辑
    if not fIsSkipHolding then
    begin
      // 例如重置相关状态等,按需添加
    end;
  end
  else
  begin
    // 未勾选Hold时,执行原单次动作逻辑
    if Game.Playing then
    begin
      if func.Modifier < 0 then
      begin
        if GameParams.NoAutoReplayMode then Game.CancelReplayAfterSkip := true;
        if CurrentIteration > (func.Modifier * -1) then
          GotoSaveState(CurrentIteration + func.Modifier)
        else
          GotoSaveState(0);
      end
      else if func.Modifier > 1 then
      begin
        fHyperSpeedTarget := CurrentIteration + func.Modifier;
      end
      else
      begin
        if fGameSpeed = gspPause then fForceUpdateOneFrame := true;
      end;
    end;
  end;
end;

5. 释放定时器资源

在窗体销毁事件(如FormDestroy)中释放定时器,避免内存泄漏:

procedure TYourForm.FormDestroy(Sender: TObject);
begin
  fSkipTimer.Free;
end;

关键说明

  • fIsSkipHolding变量用于记录当前是否处于持续执行状态,每次按下热键时切换状态
  • 定时器的Interval可根据需求调整,数值越小执行频率越高
  • 核心动作逻辑复用原有代码,避免重复编写和维护问题

内容的提问来源于stack exchange,提问作者Willicious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:48:28