使 CAPSLOCK 在单键、双键和组合键时正常工作
Make CAPSLOCK work properly when single-, double-, and combo-pressed
我想在 Windows 10 上编写 AutoHotKey
脚本,以提供 CAPSLOCK
更多功能。我对 CAPSLOCK
的目标有三个:
- 单击时,
CAPSLOCK
照常工作。
- 双击(短时间内按两次)时,
CAPSLOCK
会触发 ESC
键。 CAPSLOCK
的status/light应该和以前一样,但是灯一亮一灭,一灭一亮我都没事
- 当
CAPSLOCK
与 JKLI
组合时,CAPSLOCK + JKLI
将用作箭头键(left
、down
、right
, 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
将光标向右移动,我希望此行为具有 no 对 CAPSLOCK
.
状态的影响
请告诉我如何通过 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
我想在 Windows 10 上编写 AutoHotKey
脚本,以提供 CAPSLOCK
更多功能。我对 CAPSLOCK
的目标有三个:
- 单击时,
CAPSLOCK
照常工作。 - 双击(短时间内按两次)时,
CAPSLOCK
会触发ESC
键。CAPSLOCK
的status/light应该和以前一样,但是灯一亮一灭,一灭一亮我都没事 - 当
CAPSLOCK
与JKLI
组合时,CAPSLOCK + JKLI
将用作箭头键(left
、down
、right
,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
将光标向右移动,我希望此行为具有 no 对 CAPSLOCK
.
请告诉我如何通过 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