如何在不意外激活大写锁定模式的情况下交换 Capslock 和 Ctrl?

How to swap Capslock and Ctrl without having capslock mode activated unintentionally?

我有一个简单的 AutoHotKey 脚本:

Capslock::Ctrl
#Capslock::Capslock 

关键是,偶尔会激活大写锁定模式,即使我只希望它起到 Ctrl 的作用,但我无法让它停止。唯一的方法是暂停脚本,修复它,然后重新激活它。

我怎样才能让它按预期工作?


密钥历史记录

VK  SC  Type    Up/Dn   Elapsed Key     Window
----------------------------------------------
14  03A h   d   0.03    CapsLock        
11  01D i   d   0.00    Control         
14  03A h   d   0.03    CapsLock        
11  01D i   d   0.00    Control         
14  03A h   d   0.03    CapsLock        
11  01D i   d   0.00    Control         
14  03A h   d   0.03    CapsLock        
11  01D i   d   0.00    Control         
14  03A h   d   0.03    CapsLock        
11  01D i   d   0.00    Control         
14  03A h   d   0.03    CapsLock        
11  01D i   d   0.00    Control         
14  03A h   d   0.03    CapsLock        
11  01D i   d   0.00    Control         
14  03A h   d   0.03    CapsLock        
11  01D i   d   0.00    Control         
14  03A h   d   0.03    CapsLock        
11  01D i   d   0.00    Control         
14  03A h   d   0.06    CapsLock        
14  03A h   d   0.03    CapsLock        
14  03A h   d   0.03    CapsLock        
11  01D i   d   0.03    Control         
11  01D i   d   0.00    Control         
14  03A h   d   0.00    CapsLock        
11  01D i   d   0.00    Control         
14  03A h   d   0.03    CapsLock        
11  01D i   d   0.00    Control         
14  03A h   u   0.03    CapsLock        
11  01D i   u   0.00    Control 

您的代码的一个值得注意的问题是 Ctrl 是修饰键而 Capslock 不是,这会产生意想不到的结果,包括 Roman 所描述的结果。

试试这个:

Capslock::SendInput {Ctrl Down}
Capslock Up::SendInput {Ctrl Up}
#Capslock::Capslock

回答:

Why does pressing Shift + Caps (Shift first) activate the capslock mode?

因为 +Capslock 在技术上是另一个热键,您可能希望通过添加另一个条目 +Capslock:: 来分配另一个任务,因此默认情况下不会被 Capslock:: 捕获。

要捕获所有组合而不为每个组合添加单独的条目,请尝试:

*Capslock::SendInput {Blind}{Ctrl Down}
*Capslock Up::SendInput {Blind}{Ctrl Up}

但是,此 可能会 干扰 #Capslock:: 条目,具体取决于上下文。

因此,指定所有可能的组合是安全的,尽管它看起来有点过于复杂甚至难看。

编辑:

关于您添加的密钥历史,

  1. 您看到 3 个 CapsLock 条目后面只有 2 个 Control 条目在中间吗?我想这就是脚本以某种方式 'missed' 按键事件的地方,当脚本本身太忙于做其他事情或者 OS 由于其他任务占用而没有给脚本足够的时间片时,就会发生这种情况CPU.
  2. 我映射了一个不常用的键来修改和映射I,,,JLUpDownLeft ,有时也会发生同样的事情。就像我按住一个组合一段时间,比如说,上升 100 多行,它会在中间留下意想不到的 i。不总是,但有时
  3. 尽管如此,在脚本顶部使用 Process Priority,, A 确实 有帮助,使故障发生的频率大大降低。

中所述,可能是因为

the script itself is too busy doing something else or the OS is not giving enough time slices to the script due to other tasks hogging the CPU

所以我无能为力。所以我的解决方案是

#Space::Capslock

使用 Capslock::Ctrl 优于 Capslock::SendInput {Blind}{Ctrl Down},因为当 Shift 时,它不会激活 Shift + Ctrl先按下。