- 标题:
按键持续按下 / 防止自动重复 / 按键按下状态 - 标签:
AutoHotkey | AHK | Timer | 计时器 | 定时器 | GetKeyState | 获取按键状态 | 持续 | 保持 | 按下 | 抬起 | 释放 | 状态 | 形态 | 重复 | 间隔 | 阻塞 - 标注:
https://www.jianshu.com/p/374615ff8006
https://www.jianshu.com/u/1275d25b625e
AutoHotkey中只有少数按键(例如控制键和锁定键)带有按下(Down)和抬起(Up)形态;若想设计可持续按下的热键,则很有可能触发系统的自动重复事件(保持按下一段时间后的自动重复)。虽然可以通过调整键盘属性或启用重复键来改善此现象,但让系统设置反向适应脚本的行为显得有些本末倒置。
-
键盘 属性
可保存为快捷方式或嵌套于命令行使用。C:\Windows\System32\rundll32.exe C:\WINDOWS\System32\shell32.dll,Control_RunDLL C:\WINDOWS\System32\main.cpl,@1
-
设置筛选键
控制面板路径。控制面板\轻松使用\轻松使用设置中心\设置筛选键
-
设置重复键和慢速键
控制面板路径。控制面板\轻松使用\轻松使用设置中心\设置重复键和慢速键
本文将为您介绍,如何通过简单的判定逻辑来避免系统的自动重复事件。
Global 示例按键 := "g"
Global 示例按键_间隔 := 200 ; 按键重复的间隔.
Global 示例按键_已释放 := 1 ; 默认为抬起状态.
Hotkey, %示例按键%, 示例标签 ; 创建热键.
Return ; END AUTO-EXECUTE |
示例标签: ; 标签: 逻辑入口.
If !示例按键_已释放 ; 如果按键被判定为正在按下-
Return ; 则拒绝继续执行;
示例按键_已释放 := 0 ; 否则继续执行并将按键标记为已按下.
SetTimer, 示例标签_示例按键_按键状态, 50 ; 创建或重设计时器, 以50次/秒的速率检查按键状态.
示例标签_主逻辑: ; 标签: 主要逻辑, 随入口自然执行.
SetTimer, 示例标签_主逻辑, %示例按键_间隔% ; 创建或重设计时器, 以指定间隔重复此标签.
Send, {h} ; 发送按键.
Return ; 自然停止.
示例标签_示例按键_按键状态: ; 标签, 检查按键状态.
If !GetKeyState(示例按键, "P") { ; 如果按键不再被按下,
SetTimer, 示例标签_示例按键_按键状态, Off ; 关闭此计时器-
SetTimer, 示例标签_主逻辑, Off ; 和主逻辑计时器,
示例按键_已释放 := 1 ; 并将按键标记为已抬起.
}
Return ; END FUNC : 示例标签 /
脚本通过计时器获取按键状态并以此拒绝冗余按键;至此,脚本已按预期执行。