使两个 AutoHotkey 键重映射脚本正确协同工作

Making two AutoHotkey key remapping scripts work together correctly

我有两个 AutoHotkey 脚本,可以在笔记本电脑键盘的两侧使用 Ctrl 键:

  1. Caps Lock 映射到(左)Ctrl:

    SetCapsLockState, Off
    CapsLock::LCtrl
    
  2. 映射 Enter 到(右)Ctrl 按下时;否则(如果没有超时)发送 Enter:

    Enter::RCtrl
    ~Enter Up::Send % "{RCtrl up}" (A_PriorKey = "Enter" ? "{Enter}" : "")
    

这两个脚本几乎没有极端情况。

但是,我无法触发Ctrl + Enter,这是我通常用来打开新行的快捷方式在我的文本编辑器上。按下 Caps Lock 并按下 Enter,没有任何反应。即使我按下(左)Ctrl(真正的键)并按下 Enter,也没有任何反应。

为了启用 Ctrl + Enter?

我应该怎么做才能让两个脚本协同工作

我试过 Libreoffice Writer,CTRL+ENTER 转到下一页.. 上面的代码工作正常。 刚刚在 Enter::RCtrl 之前添加了 ~ 以不阻止 Enter 键的本机功能。

SetCapsLockState, Off
CapsLock::LCtrl
~Enter::RCtrl
~Enter Up:: Send % "{RCtrl up}" (A_PriorKey = "Enter" ? "{Enter}" : "")

P.S: 而且我认为您可以只对两个指令使用一个脚本,而不是对每个指令使用一个脚本..

我分两步解决了这个问题:

  1. 本地将 CapsLock 映射到 Control。 AutoHotkey 认为我的 CapsLock 键确实是 Control 键,这使我免于处理 AutoHotkey 中奇怪的 CapsLock on/off 边缘情况。

  2. 使用以下脚本将 Enter 映射为双函数 RCtrl/Enter:

LShift & Enter Up::
  GetKeyState, state, Shift
  if (A_PriorKey = "Enter" and state = "D") {
    Send +{Enter}
  }
  Send {LCtrl Up}{RCtrl Up}
  Return
LCtrl & Enter Up::
  GetKeyState, state, Control
  if (A_PriorKey = "Enter" and state = "D") {
    Send ^{Enter}
  }
  Send {LCtrl Up}{RCtrl Up}
  Return
LAlt & Enter Up::
  GetKeyState, state, Alt
  if (A_PriorKey = "Enter" and state = "D") {
    Send !{Enter}
  }
  Send {LCtrl Up}{RCtrl Up}
  Send {LAlt Up}{RAlt Up}
  Return
Enter::RCtrl
~Enter Up::
  Send % "{RCtrl up}" ((A_PriorKey = "Enter") ? "{Enter}" : "")

非常令人兴奋,因为它非常有效!作为对称控制键的 CapsLock 和 Enter 之间的修饰符舞蹈是完美的,我可以在两侧之间无缝切换,而不会出现令人讨厌的边缘情况、意外的修饰符按下、释放或 {Enter} 按下。声明的顺序对于它的工作非常重要;边缘情况必须先出现。

但是,如您所见,需要显式处理Alt + Enter, Ctrl + EnterShift + Enter。如果我需要 Ctrl + Alt + Enter,我也需要处理它。

我想知道是否有更好的方法来完成这项工作而无需定义这些额外的映射。