长按AHK替代键

时间:2019-05-03 08:07:35

标签: key autohotkey alternate

我有一个带有这些箭头字符(小于/大于)的键盘,作为Y和X上的备用键。

Keyboard

在此示例中,我们将重点放在键X上。

默认情况下,备用字符>当然是用AltGr + X触发的。

但是我想通过简单地长按X来触发它,以加快速度并且不需要第二只手或手指。

到目前为止,我有以下内容,这些是我从其他帖子中获得的:

$x::
    KeyWait, x, T0.2

    if (ErrorLevel)
        Send > ;long

    else {
        KeyWait, x, D T0.2

        if (ErrorLevel)
            Send x ;single
    }

    KeyWait, x
return

这基本上有效,但是有一个主要缺陷: 现在,正常的一次按键操作会花费太多时间来写入正常的X字符。

例如,如果您快速写一个像“ exchange”之类的单词,您将得到诸如“ echxange”之类的东西,因为X花费了太多的时间来发送。

那么如何修改此脚本以解决该问题?我的想法是一旦注册了{X Up},就发送普通X并中止整个脚本。因此,{X Up}之后,他将不再等待。

还有其他想法吗?

谢谢。

4 个答案:

答案 0 :(得分:1)

下面的代码对我来说似乎很好,但是请注意,如果您连续输入多个x,则有可能(有一些不幸的时机)错误地替换“ x”。这个,“ xxxx> xxx”。我将睡眠时间增加到350ms,以减少这种情况的发生,但这是需要注意的事情,应该进行更改以适合您的任何需求。

~x::
Sleep , 350
BlockInput , On
Send , % GetKeyState( "x" , P ) ? "{backspace}>" : ""
KeyWait , x , U
BlockInput , Off
Return

请注意,由于它发送退格键,因此在非键入环境中使用它可能会得到意想不到的结果,例如在无法输入文本的浏览器中,它可能返回上一页。如果需要,可以通过使用WinActive或类似的方法过滤掉这些特定方案来缓解这种情况。

答案 1 :(得分:1)

这是一种计算按键持续时间的解决方案,缺点是您始终必须释放按键才能获得所需的输入。这意味着您不能按住x来输入xxxxxxxx。

$x::
    startTime := A_TickCount ;record the time the key was pressed
    KeyWait, x, U ;wait for the key to be released
    keypressDuration := A_TickCount-startTime ;calculate the duration the key was pressed down
    if (keypressDuration > 200) ;if the key was pressed down for more than 200ms send >
    {
        Send > 
    }
    else ;if the key was pressed down for less than 200ms send x
    {
         Send x 
    }

return

答案 2 :(得分:0)

非常简单,但是需要2个单独的脚本。
首先运行此脚本以阻止重复(我几乎可以确定它是您想要的)。

SendMode Input 

$x::
    send {x}
    keywait, x
    send {x up}
return

然后运行第二个脚本,该脚本执行逻辑:

SendMode Input 

dt := 30            ;  milliseconds time resolution
timeout := 1500 ;  timeout

loop 
{
    sleep %dt%                      ; sleep to reduce CPU usage
    p := getkeystate("x", "P")          ; getkeystate
    if (p = 1) {
        timer += dt
    }
    if (p = 0) {
        timer := 0
    }
    ; tooltip pressed:  %p%  timer: %timer%
    if (timer > timeout) {
        send {backspace}
        send {>}
        timer := 0              ; reset timer
    }
}

它将正常输入x,并在1.5秒后输入>,请参见timeout变量。诀窍在于,在后一种情况下,它会删除最后一个x,因此您只会得到>

答案 3 :(得分:0)

我接受了Yane提供的答案,并对其进行了一些改进。

区别:释放密钥时,Yane的答案将发送密钥。我的示例将在设置的时间后发送长按住键。这样一来,您便知道何时按住键足够长的时间。

$x::
    timeHasElapsed := 0
    SetTimer, SendAngleBracketRight, -200 ;if the key was pressed down for more than 200ms send > (negative value to make the timer run only once)
    KeyWait, x, U ;wait for the key to be released
    if (timeHasElapsed == 0) ;if the timer didn't go off disable the timer and send x
    {
        SetTimer, SendAngleBracketRight, OFF
        SendInput, x
    }
return

SendAngleBracketRight:
    SendInput, >
    timeHasElapsed := 1
return