4

我正在寻找使用 AutoHotKey 来修改我的 shift 键的功能。该功能在 Steve Losh 的博客条目中进行描述。具体来说,我希望我的 shift 键执行以下操作:

  • 如果在 300 毫秒内按下并释放LShift或且其间没有按下其他键,则分别发送或。RShift()
  • 如果LShift和在 300 毫秒RShift内“滚动”在一起(按下LShift、按下RShift、释放LShift、释放RShift等),则发送())(
  • 如果不正确地使用 shift 键(LShiftand S, RShiftandK等),则不会发生任何事情。

我一直遇到 300 毫秒要求和“滚动”功能的问题。具体来说,由于热键组合,我只能检测到何时释放键,例如:

LShift &  0:: return

这是我目前所处的位置:

LShift::
    Send {LShift Down}
    KeyWait, LShift
    Send {LShift Up}
    if (A_TimeSinceThisHotkey < 300){
        if (A_PriorKey = "LShift")
        {
            Send {)}
        }
    }
return
4

4 回答 4

3

无论如何,我看不到使用 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 已经是前缀热键,我省略了这里描述的技巧。

于 2013-07-16T14:52:06.213 回答
1

MCL 的答案很接近,但是当我对其进行测试时,我发现单击 shift 并没有选择文本。这是一个带有直通功能的版本,允许单击移位工作。

;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 毫秒超时是不可能的。当我试图让它工作时(使用http://www.autohotkey.com/board/topic/98742-remapping-shift-key/)我发现它A_PriorHotkey并没有持续填充。我不认为该变量旨在以这种方式与修饰键一起使用。

于 2015-03-05T04:07:02.260 回答
0

我觉得有必要弄清楚这一点。干得好!

我基本上为每个Shift+Letter组合键创建了一个热键,以便发送正确的键盒并设置Abort值。然后,每当按下其中一个键时都会引用该AbortShift,以确定是否发送相应的(or )

“滚动”是通过为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

编辑: 嗯,我似乎和你有同样的问题。由于热键,我总是得到 0 的持续时间。

于 2013-07-15T15:27:23.247 回答
0

我在 AutoHotKey 论坛上找到并修改了这个脚本。(如果你输入得太快,当你打算输入“K”时,原始脚本很容易输入“K(”,所以我已经对其进行了修改,以便不再发生)

$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
于 2016-04-20T22:37:27.713 回答