这是一个替代解决方案。你必须有 AutoHotKey_L 才能工作,因为传统的 AutoHotKey 不支持#if。
CapsLock & s::
Flag:=!Flag
If (Flag)
TrayTip, AutoHotKey, Numpad ON, 1
Else
TrayTip, AutoHotKey, Numpad OFF, 1
Return
#If (Flag)
m::Send, 0
k::Send, 1
#If
在第一个块中,您使用 CapsLock + s 将标志切换为 True/False,并使用托盘提示显示状态,然后在下一个块中定义某些键的行为。或者,您可以删除第一个块并将 #if (Flag) 行替换为:
#If (GetKeyState("CapsLock", "P") and GetKeyState("s", "P"))
更新:
尝试了以下不同的结果。第一个(注释掉的)代码确实使用 CapsLock + s,但显然按下 s 键会阻止 AutoHotKey 看到某些其他按键(这里的字母 n、m、i、o、p 有效,但 j、k、l 处于打开状态未检测到键盘上相同的高度/扫描线)
SetCapsLockState, alwaysoff
/*
Capslock & s::
While, (GetKeyState("CapsLock", "P") and GetKeyState("s", "P"))
{
Input, MyKey, I L1 T0.5
TrayTip, Key:, %MyKey%
if (MyKey = "m")
Send, 1
if (MyKey = "i")
Send, 2
if (MyKey = "k")
Send, 3
if (MyKey = "j")
Send, 4
if (MyKey = "o")
Send, 5
if (MyKey = "p")
Send, 6
}
Return
*/
仅使用 CapsLock(也与 j,k,l 一样)有效,但这不是您想要的。
Capslock::
While, (GetKeyState("CapsLock", "P"))
{
Input, MyKey, I L1 T0.5
TrayTip, Key:, %MyKey%
if (MyKey = "m")
Send, 1
if (MyKey = "i")
Send, 2
if (MyKey = "k")
Send, 3
if (MyKey = "j")
Send, 4
if (MyKey = "o")
Send, 5
if (MyKey = "p")
Send, 6
}
Return