使用 AutoHotKey,根据按下按键的时间长短,让按键表现为开关或普通按键

使用 AutoHotKey,根据按下按键的时间长短,让按键表现为开关或普通按键

我目前正在使用 AutoHotKey 模拟 Topre Realforce 89s 上的 Happy Hacking Keyboard Pro 2 键映射。

我编写的脚本可以在github

我使用日文键“muhenkan”(SC07B)来模拟该Fn键,并添加了所有Fn组合键映射,如以下两个示例所示:

SC07B & SC002::send,{Blind}{F1} ; Fn + 1 -> F1
SC07B & SC01A::send,{Blind}{Up} ; Fn + [ -> Up

由于位于空格键的左侧和右侧,我还想使用“muhenkan”和“henkan”(SC079)作为EnterBackspace

将“henkan”重新Backspace映射到:

SC079::send,{BS}
+SC079::send,{BS}
^SC079::send,^{BS}

关于用作Fn切换键的“muhenkan”,我Enter使用以下行将其映射到键:

SC07B::send,{Enter}

看起来它与 Enter 一起使用并不冲突Fn

  • 与另一个键组合时,它不会输出Enter
  • 当没有其他键组合时,Enter释放后输出

有时候,我可能首先按下该Fn键,试图将其与另一个键组合,但最终通过释放该Fn键放弃了该意图。

问题是,释放按键后,它会输出 Enter 键,这并不理想。

我想通过配置该Fn键来改进这一点,以便当释放时,仅当满足以下两个条件时才输出 Enter:

  • Fn在按下和释放该键期间没有按下其他键
  • DOWN按下/释放( / )之间的持续时间UP小于给定值(例如:500 毫秒)

有没有一种简单的方法可以修改我的 AutoHotKey 配置,以继续使用 SC07B 作为切换键(Fn),并将其映射到 Enter 并满足之前的条件?

我定义组合键的事实似乎使得映射Enter在按键释放时起作用,这正是我想要的,但这也意味着我不能使用 KeyWait 并检查超时,因为我相信命令只会在按键释放后启动(这没有意义)。

A_TimeSincePriorHotkey 也不能用,因为它没有反映当前热键被按下和释放之间所花费的时间。

答案1

你可以这样使用A_TickCountKeyWait确定按下某个键的时间长度:

LCtrl:: ;hotkey has 3 different functions based on press duration
    keyDown := A_TickCount
    Keywait LCtrl
    If ((A_TickCount-keyDown) < 300)
        Send {Enter}
    If ((A_TickCount-keyDown) > 300) and ((A_TickCount-keyDown) < 600)
        Send {Left}
    If ((A_TickCount-keyDown) > 600)
        Send {Right}
Return

但是,这不允许您使用组合键(即Ctrl+ a)。

为了完成这个任务,您必须使用While GetKeyState()类似于下面的方法:

RCtrl::
    keyDown := A_TickCount
    While GetKeyState("RCtrl", "P")
        Send {Ctrl Down}
    duration := A_TickCount - keyDown
    Send {Ctrl Up}
    if duration < 300
        Send {Enter}
    Return

这将允许您仍然执行Ctrl+a等组合键。如果这个答案对您有用,请告诉我。

相关内容