按键持续按下/防止自动重复/按键按下状态[AutoHotkey|AHK][Timer|计时器|定时器][GetKeyState|获取按键状态][持续|保持|按下|抬起|释放|状态|形态|重复|间...


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 : 示例标签 /

脚本通过计时器获取按键状态并以此拒绝冗余按键;至此,脚本已按预期执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。