我希望实现以下目标:
我按下并释放C键,就像平常一样键入了字母C
。
但是,我想按下并释放C键,并让CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC..
连续输入,直到我再次按C键。
后者在Delphi代码中作为一个关键函数看起来如何?
本质上,我有一个热键分配给一个函数,它工作,但我想改变它,使一个热键的单次按下导致函数继续重复,直到热键被再次按下。
下面是代码:
lka_Skip:
if Game.Playing then
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
if fGameSpeed = gspPause then fForceUpdateOneFrame := true;
我已经可以在lka_Skip
函数中添加一个"Hold"复选框,但我需要一行代码,说明"如果选中了Hold框,则重复执行该操作,直到再次按下该键"。
2条答案
按热度按时间7cwmlq891#
如果我没理解错的话,您正在研究如何在
True
和False
状态之间切换布尔值。您可以使用布尔运算符
not
轻松完成此操作。您可以在文档中阅读更多关于布尔运算符的信息因此,在
True
和False
之间切换某个布尔值的代码将非常简单:ldfqzlk82#
在窗体的OnKeyPress、OnKeyDown或OnKeyUp中,检查按下的键是否为“C”。如果是,则通过启动TTimer开始生成“ccccc”序列。还将布尔变量(我们称之为GenerateC)设置为True。
下一次按“c”键并进入OnKeyPress事件处理程序时,检查变量是True还是False。如果为True,则停止生成“ccccc”序列(停止计时器)。如果为False,则开始生成。当然,还将对变量求反:
注意:您的表单可能需要将KeyPreview属性设置为True。KeyPreview默认为false!
如果KeyPreview为true,则键盘事件在活动控件上发生之前先在窗体上发生。(活动控件由ActiveControl属性指定。)
如果KeyPreview为false,则键盘事件仅在活动控件上发生。
定位键(Tab、BackTab、箭头键等)不受KeyPreview的影响,因为它们不生成键盘事件。同样,当按钮具有焦点或其Default属性为true时,Enter键不受KeyPreview的影响,因为它不生成键盘事件。
我个人经常使用KeyPreview,所以我可以用Enter和Escape关闭表单: