Delphi实现勾选Hold后热键单次触发重复执行至再次按下的代码方案
Delphi实现热键单次触发持续执行功能
需求说明
原本按下并释放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
相关产品推荐
相关产品推荐

