Autohotkey Shift键训练轮和Shift圆括号重新映射

Autohotkey Shift键训练轮和Shift圆括号重新映射,autohotkey,Autohotkey,我希望使用自动热键来修改我的shift键的功能。Steve Losh的博客中描述了该功能。具体而言,我希望我的shift键执行以下操作: 如果在300毫秒内按下并释放了LShift或RShift,且其间未按下其他键,则分别发送(或) 如果在300毫秒内将升档和升档“滚动”在一起(按下升档、按下升档、松开升档、松开升档等),发送()或)() 如果换档钥匙使用不当(L换档和S、R换档和K等),则不会发生任何情况 我在300ms要求和“滚动”功能方面遇到了一些问题。具体来说,我遇到的问题是,由于热

我希望使用自动热键来修改我的shift键的功能。Steve Losh的博客中描述了该功能。具体而言,我希望我的shift键执行以下操作:

  • 如果在300毫秒内按下并释放了LShift或RShift,且其间未按下其他键,则分别发送
  • 如果在300毫秒内将升档和升档“滚动”在一起(按下升档、按下升档、松开升档、松开升档等),发送
    ()
    )(
  • 如果换档钥匙使用不当(L换档和S、R换档和K等),则不会发生任何情况
我在300ms要求和“滚动”功能方面遇到了一些问题。具体来说,我遇到的问题是,由于热键组合,我只能检测何时释放键,例如:

LShift &  0:: return
这就是我目前的处境:

LShift::
    Send {LShift Down}
    KeyWait, LShift
    Send {LShift Up}
    if (A_TimeSinceThisHotkey < 300){
        if (A_PriorKey = "LShift")
        {
            Send {)}
        }
    }
return
LShift::
发送{LShift Down}
钥匙等待,换档
发送{LShift Up}
如果(自该热键起的A_时间<300){
如果(A_priworkey=“LShift”)
{
发送{}
}
}
返回

我觉得有必要弄明白这一点。给你

我基本上为每个Shift+字母键组合创建了一个热键,以便发送正确的键大小写,并设置
Abort
值。然后,每当按下其中一个Shift键以确定是否发送相应的(或)命令时,就会引用
Abort

“滚动”是通过为LShift+RShift(反之亦然)创建热键来完成的。然后,它查看先释放哪个键以确定
()
)(

如果这就是你想要的,那就接受吧

Loop 26
{
    Hotkey, % "~LShift & " Chr(A_Index+96), LetterKey ; Hotkeys for A-Z
    Hotkey, % "~RShift & " Chr(A_Index+96), LetterKey ; Hotkeys for A-Z
}
Return

RShift::
LShift::
    Abort := 0
    keyDown := A_TickCount
    Keywait, % A_ThisHotkey
    duration := A_TickCount - keyDown
    If (duration < 200) and (Abort = 0)
        SendInput % (A_ThisHotkey = "LShift") ? "(" : ")"
    Send {LShift Up}
    Return

RShift & LShift::
LShift & RShift::
    Keywait, LShift
    If GetKeyState("RShift", "P")
    {
        Keywait, RShift
        Send ()
    }
    Else
        Send )(
    Return

LetterKey:
    SendInput, % "+" SubStr(A_ThisHotKey, 0, 1)
    Abort := 1
Return
循环26
{
热键,%“~LShift&”Chr(A_索引+96),字母键;A-Z的热键
热键,%“~RShift&”Chr(A_索引+96),字母键;A-Z的热键
}
返回
换档::
LShift::
中止:=0
keyDown:=A_TickCount
按键等待,%A\u此热键
持续时间:=A_TickCount-向下键
如果(持续时间<200)和(中止=0)
SendInput%(A_ThisHotkey=“LShift”)?“(:”)
发送{LShift Up}
返回
升档和降档::
升档和升档:
钥匙等待,换档
如果GetKeyState(“RSShift”、“P”)
{
钥匙等待,重新换档
发送()
}
其他的
发送)(
返回
字母键:
SendInput,%%“+”子字符串(A_this热键,0,1)
中止:=1
返回
编辑:
嗯,我似乎和你有同样的问题。由于热键的原因,我的持续时间总是为0。

我看不出有任何理由使用300毫秒超时,因为它似乎不可靠且不必要。
看看这段注释代码,它简短高效,似乎满足了您的所有要求:

LShift::Send, (
RShift::Send, )
LShift & RShift:: Send, ()
RShift & LShift:: Send, )(

/* Put your unwanted combinations here
 * and let them do nothing
*/
LShift & q::return
RShift & y::return
编辑:

由于LShift和RShift已经是前缀热键,我省略了所描述的技巧。

MCL的答案很接近,但当我测试它时,我发现shift clicking并没有选择文本。下面是一个带有passthrough的版本,允许shift clicking工作

;shift to parens
LShift::Send, (
RShift::Send, )
LShift & RShift:: Send, ()
RShift & LShift:: Send, )(

;passthrough for shift-click
LShift & LButton::
  Send, {LShift Down}{LButton}
  Send, {LShift Up}
RShift & LButton::
  Send, {RShift Down}{LButton}
  Send, {RShift Up}
如果不深入了解autohotkey的实现或对autohotkey进行实际修改,我认为300毫秒超时是不可能的我发现A_\u prior热键的填充方式不一致。我不认为该变量应该以这种方式与修改键一起工作。

我在自动热键论坛上找到并修改了该变量。(当您打算键入“K”时,原始脚本倾向于键入“K”)如果你打字太快,那么我已经修改了它,这样就不会再发生这种情况了)


是的,你可能会认为会有某种变通办法,但我还没有弄明白。不过谢谢你的努力!300毫秒超时的原因是当我开始键入内容,但在按下shift键后改变主意时。我不希望击键被误解为括号有意。我的
Caps-Lock
键以这种方式工作得非常可靠。轻触时,它发送
Esc
,保持时,它发送
Ctrl
@MikeMyers。我不太明白这一点。如果你键入错误,在99.9%的情况下,你将不得不处理它。如果你不小心键入了“a”,没有回去的路了,是吗?那么为什么要在这种情况下破例呢?你是对的;在不小心键入
a
时,你仍然保留
a
。然而,这与
Shift
键不太相似,因为在进行此修改之前,如果我不小心按了
Shift
键,那么返回的方式就是rel如我在问题中所述,超时将允许扩展
Shift
键,同时也允许在出现打字错误时熟悉旧的
Shift
键。
$LShift Up::send, % getkeystate("LShift") ? "{LShift Up}" : ""
$RShift Up::send, % getkeystate("RShift") ? "{RShift Up}" : ""

~$LShift::
    KeyWait, LShift, T0.1 ; wait 100ms to check shift state
    if (A_PriorKey = "LShift")
    {
        send, % getkeystate("LShift") ? "{LShift Down}" : "("
    }
    KeyWait, LShift
return

~$RShift::
    KeyWait, RShift, T0.1 ; wait 100ms to check shift state
    if (A_PriorKey = "RShift")
    {
        send, % getkeystate("RShift") ? "{RShift Down}" : ")"
    }
    KeyWait, RShift
return