我目前正在使用 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)作为Enter和Backspace。
将“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_TickCount
和KeyWait
确定按下某个键的时间长度:
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等组合键。如果这个答案对您有用,请告诉我。