使 CAPSLOCK 在单键、双键和组合键时正常工作

Make CAPSLOCK work properly when single-, double-, and combo-pressed

我想在 Windows 10 上编写 AutoHotKey 脚本,以提供 CAPSLOCK 更多功能。我对 CAPSLOCK 的目标有三个:

  1. 单击时,CAPSLOCK 照常工作。
  2. 双击(短时间内按两次)时,CAPSLOCK 会触发 ESC 键。 CAPSLOCK的status/light应该和以前一样,但是灯一亮一灭,一灭一亮我都没事
  3. CAPSLOCKJKLI 组合时,CAPSLOCK + JKLI 将用作箭头键(leftdownright, up). 和目标2一样,CAPSLOCK的status/light应该和以前一样。灯一亮一灭我就没事了在此过程中,只要终端状态正确).

如果我只需要目标 #1 和目标 #3,下面的脚本就可以正常工作。

CapsLock & J::Send {Left}
CapsLock & K::Send {Down}
CapsLock & L::Send {Right}
CapsLock & I::Send {Up}

但是,现在我也想实现目标#2,并在它之前添加了一些行,如下

~CapsLock::
    KeyWait, CapsLock
    KeyWait, CapsLock, D T0.2
    if not ErrorLevel
        Send {Escape}
Return

CapsLock & J::Send {Left}
CapsLock & K::Send {Down}
CapsLock & L::Send {Right}
CapsLock & I::Send {Up}

现在我遇到了问题:目标#1 和目标#2 已实现,但目标#3 未实现。 CAPSLOCK 的 status/light 会在我按下 CAPSLOCK + L 后改变。这不是我想要的——我想按住 CAPSLOCK 并按 L 将光标向右移动,我希望此行为具有 noCAPSLOCK.

状态的影响

请告诉我如何通过 CAPSLOCK 使用 AutoHotKey 实现我的三个目标。非常感谢任何帮助!

顺便说一句,我正在研究2016年生产的Lenovo Thinkpad T型号

您需要一个定时器来恢复组合更改后的 CapsLock 状态:

Capslock::
    If (A_PriorHotKey = "~Capslock Up" AND A_TimeSincePriorHotkey < 400 AND A_TimeSincePriorHotkey > 50) ; double-press
        Send, {Esc} 
    SetTimer, RestoreCapslockState, 50
return

~Capslock Up:: return ; The tilde prefix (~) prevents AHK from blocking the key-down/up events

CapsLock & J::Send {Left}
CapsLock & K::Send {Down}
CapsLock & L::Send {Right}
CapsLock & I::Send {Up}

RestoreCapslockState:   
    KeyWait, Capslock ; wait for Capslock to be released
    SetTimer, RestoreCapslockState, OFF
    If (A_PriorKey != "Capslock") 
        SetCapsLockState % !GetKeyState("CapsLock", "T") ; Toggles CapsLock to its opposite state, requires [v1.1.30+]
return

https://www.autohotkey.com/docs/commands/SetTimer.htm

https://www.autohotkey.com/docs/commands/SetNumScrollCapsLockState.htm#ex2