如何检测自动热键中两个键的同时按下?

时间:2019-05-31 07:53:26

标签: autohotkey

我正在努力寻找一种解决方案,该解决方案可以检测到同时按下fj的情况,因此,如果仅按下fj,当前应用程序也会收到ff,但是当我同时按下f和(在短时间内)j时,当前应用程序都不会收到密钥。

我知道在检测到fj之后,我必须以某种方式等待较短的时间段(可能为0.2秒),以便确定是否应使用send将按下的fj赋予当前应用程序,或者如果我必须“吞咽”这两者并继续执行我的宏。 可是,我不知道该怎么办。

1 个答案:

答案 0 :(得分:2)

相对简单的解决方案是直接检测组合,而不会阻塞这两个键的输入。一旦检测到两个键均被按下,请通过发送两次backspace键来删除输入结果,然后运行所需的命令。这样的好处是您仍然可以键入文本而没有任何问题。
OTOH仅在当前焦点位于文本输入应用程序/小部件上且backspace表示删除最后一个字符的情况下,它才能正常工作。在其他情况下,您可能会得到一些惊喜,例如激活随机命令。
这是一个示例,我在这里使用了xc键。命令触发的位置是行send {O}

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.

dt := 30            ;  milliseconds sleep
k1name := "x"       ;  key 1
k2name := "c"       ;  key 2

loop 
{
    sleep %dt%                              ; sleep to reduce CPU usage
    k1 := getkeystate(k1name, "P")          ; get key 1 state
    k2 := getkeystate(k2name, "P")          ; get key 2 state

    if ( ! ( getkeystate("Ctrl", "P") || getkeystate("Alt", "P") || getkeystate("Shift", "P") ) ) {
        if ( k1 && k2 && !trig ) {
            send {backspace 2}
            send {O}        ; send some command 
            trig := 1       ; set flag to avoid repetition
        }
        if ( !k1 || !k2 ) {
            trig := 0
        }
    }
}

也可以使用解决方案来覆盖这些键的行为,但这将更加复杂,并且存在注释中已提及的问题。由于其简单性,我个人倾向于采用上述解决方案。