【问题标题】:Autohotkey delay all input自动热键延迟所有输入
【发布时间】:2015-03-15 19:24:38
【问题描述】:

我正在尝试编写一个脚本来延迟我发送的所有物理按键。这包括按下键、按下键和按下键的持续时间。

目前为止

a::
    if( not GetKeyState("a"))
    sleep 1000
    sendinput {a down}
return

a up::
    sleep 1000
    sendinput {a up}

但问题是,由于我无法理解的原因,并非每次中风都会延迟。当按键被按住时,接下来的几次按下和释放都不会延迟。

我想询问是否有一种方法可以简单地延迟我的所有输入(无论是使用 AHK 还是其他应用程序)而不是为每个键都执行这样的脚本也是合适的。

【问题讨论】:

标签: input delay autohotkey


【解决方案1】:

为热键添加前缀$

这通常只有在脚本使用发送命令发送组成热键本身的键时才需要,否则可能会导致它自己触发。 $ 前缀强制使用键盘钩子来实现这个热键,它的副作用是阻止发送命令触发它。 $ 前缀相当于在此热键定义上方的某处指定了#UseHook。

[v1.1.06+]:#InputLevel 和 SendLevel 提供了额外的控制,以控制由 Send 命令触发的热键和热字符串。

来源http://ahkscript.org/docs/Hotkeys.htm#Symbols

【讨论】:

    【解决方案2】:

    首先,我想不出一种简单的方法来适当地延迟密钥释放..

    以下是一个不好的解决方法。我也会对更好的解决方案很感兴趣。

    aUp = false
    delay_when_pressing_down = 200
    delay_between_sends = 10
    return
    
    $a::
        aUp = false
        delay_start := a_tickCount
        sleep 1000
        send a
        sleep, %delay_when_pressing_down%
        if aUp = true
        {
            time_a_was_pressed_down := time_of_release - delay_start
            time_a_was_pressed_down -= %delay_when_pressing_down%
            start := a_tickCount
            loop
            {
                now := a_tickCount
                diff := now - start
                if diff > %time_a_was_pressed_down%
                    break
                send a
                sleep, %delay_between_sends%
            }
            return
        }
        loop
        {
            send a
            sleep, %delay_between_sends%
            if aUp = true
            {
                start := a_tickCount
                loop
                {
                    send a
                    sleep, %delay_between_sends%
                    now := a_tickCount
                    diff := now - start
                    if diff > 1000
                        break
                }
                break
            }
        }
    return
    
    $a up::
        time_of_release := a_tickCount
        aUp = true
    return
    
    ^e::reload
    

    【讨论】:

    • 效果比我的尝试好得多,唯一的问题是延迟计时器运行时密钥没有注册。所以不幸的是,目前这并没有延迟“所有”击键。
    • 我开始感觉很糟糕,因为我的帖子中有大量的业余爱好者。无论如何,我不确定我是否理解您的担忧,但我添加了一些内容。可能会按照您现在期望的方式工作。
    猜你喜欢
    • 2012-12-27
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多