问题在于您的 shift 键在按键之间被释放。
例如,尝试在 Excel 中按这样的键,您会发现您实际上并没有选择单元格,您只是突出显示它们:
Shift Down, Up Arrow, Shift Up
Shift Down, Up Arrow, Shift Up
Shift Down, Up Arrow, Shift Up
...
因此,您必须在整个选择过程中一直按住 shift 键。
这是我能想到的:
CapsLock::Shift
#If, GetKeyState("CapsLock", "P")
*i::
if (GetKeyState("Alt", "P"))
SendInput, {Blind}{Alt Up}{Up}
else
SendInput, {Up}
return
*l::
if (GetKeyState("Alt", "P"))
SendInput, {Blind}{Alt Up}{Right}
else
SendInput, {Down}
return
#If
或者像这样用三元组写得更干净:
CapsLock::Shift
#If, GetKeyState("CapsLock", "P")
*i::SendInput, % GetKeyState("Alt", "P") ? "{Blind}{Alt Up}{Up}" : "{Up}"
*l::SendInput, % GetKeyState("Alt", "P") ? "{Blind}{Alt Up}{Right}" : "{Right}"
#If
那么发生了什么?
首先我们使用简单的重映射语法(docs) 将CapsLock 重映射为Shift。
然后我们使用#If(docs)为 I 和 L 创建上下文相关热键。
只有当 CapsLock 的 物理 状态为关闭时,才会触发热键。
我们需要物理状态,因为逻辑状态(默认)被重新映射为 shift。
热键是使用 * 修饰符创建的.
我切换了Send 命令SendInput,因为它是推荐的更快、更可靠的发送模式(docs)。
然后是关于{Blind}。通常,当您使用发送命令发送某些内容时,它会自动释放您可能持有的任何修饰符。但是如果你使用盲发模式(docs),就不会出现这种情况。所以 Shift 仍然一直按住。