我正在努力寻找一种解决方案,该解决方案可以检测到同时按下f
和j
的情况,因此,如果仅按下f
或j
,当前应用程序也会收到f
或f
,但是当我同时按下f
和(在短时间内)j
时,当前应用程序都不会收到密钥。
我知道在检测到f
或j
之后,我必须以某种方式等待较短的时间段(可能为0.2秒),以便确定是否应使用send
将按下的f
或j
赋予当前应用程序,或者如果我必须“吞咽”这两者并继续执行我的宏。
可是,我不知道该怎么办。
答案 0 :(得分:2)
相对简单的解决方案是直接检测组合,而不会阻塞这两个键的输入。一旦检测到两个键均被按下,请通过发送两次backspace
键来删除输入结果,然后运行所需的命令。这样的好处是您仍然可以键入文本而没有任何问题。
OTOH仅在当前焦点位于文本输入应用程序/小部件上且backspace
表示删除最后一个字符的情况下,它才能正常工作。在其他情况下,您可能会得到一些惊喜,例如激活随机命令。
这是一个示例,我在这里使用了x
和c
键。命令触发的位置是行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
}
}
}
也可以使用解决方案来覆盖这些键的行为,但这将更加复杂,并且存在注释中已提及的问题。由于其简单性,我个人倾向于采用上述解决方案。