我有一个带有这些箭头字符(小于/大于)的键盘,作为Y和X上的备用键。
在此示例中,我们将重点放在键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}之后,他将不再等待。
还有其他想法吗?
谢谢。
答案 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