;作为新的修改键

; as a new modifier key

我希望 ; 成为一个新的修改键。 以下几乎完美。

`;::
if GetKeyState("LShift", "P")
    Send `:
else
    Send `;
return

`; & x::
if GetKeyState("LShift", "P")
    ...
else
    ...
return

只有以下愿望清单中的第 2 点不起作用。有人知道如何修复此代码吗?

  1. ; 单独按下时 ;
  2. shift ; 单独按下时 :
  3. ; 其中 x 是第二个 ...
  4. shift;x 成为第一个 ...

在我看来,有两种方法可以使第 2 点发挥作用。

方法 1: 保持 Left Shift 键的默认行为

shift + ; 导致 : 冒号键被按下。您可以通过在 `; 之前添加波浪号“~”键并删除

来使第 2 点起作用
else 
    send `;

使用 ~ 可以保持键的默认行为。新脚本看起来像这样

~`;::
    if GetKeyState("LShift", "P") 
        Send `:
return 

`; & x::
    if GetKeyState("LShift", "P")
        ...
    else
        ...
return

通过使用此方法脚本将能够使用 shift+;.

发送 :

方法 2:删除左移键的默认行为

在您的代码中添加以下代码段

LShift::
    Send, {} 
return 

此代码段将使第 2 点起作用,但会使 Left Shift 键对其他所有内容几乎无用。

编辑

方法三:让;等待x

KeyWait添加到脚本中将使其在执行代码之前等待一定时间。其次使用 Lshift + ; 作为单独的热键组合将输出到 :,无需在 return.

中使用 ~
`;::
KeyWait, `;, T0.2
    Send `;
return

LShift & `;::
    Send `:
return 

`; & x::
KeyWait, `;, T0.2 
if GetKeyState("LShift", "P")
    ...
else
    ...
return 

以下工作完美,但由于代码重复而变得丑陋。也许更简洁的代码是可能的。

started := 0
LShift & `;::
if started = 0
    started := A_TickCount
return
`;::
if started = 0
    started := A_TickCount
return

LShift & `; Up::
if A_TickCount - started < 500
    Send `:
started = 0
return

`; Up::
if A_TickCount - started < 500
    Send `;
started = 0
return

`; & x::
started = 0 ; <==== !
if GetKeyState("LShift", "P")
    ...
else
    ...
return

;x 组合使用(无延迟)或按下超过半秒时,现在可以用作修饰键。延迟不是必需的,可以删除;它只是为了防止将意外的修改键按下误解为 ;。冒号 : 也能正常工作。

#MaxThreadsPerHotkey 2 ; allow 2 "instances" of the hotkey subroutine to exist simultaneously

`;::
If (A_PriorKey = "`;") ; ; was pressed alone
    Send `;
return

LShift & `;:: Send :

`; & x::
if GetKeyState("LShift", "P") ;  ; & LShift & x
    Send a
else                          ; ; & x
   Send b
return