Autohotkey 在自动热键结果中双击键ctrl+;钥匙

Autohotkey 在自动热键结果中双击键ctrl+;钥匙,autohotkey,Autohotkey,我的Ctrl键坏了。我正在寻找以下解决方案: x=Ctrl-x 其中x是任意键(包括F1、F2等) 换句话说,如果我连续按任意键(比如x)两次(即两次按之间的时间小于一定数量),我可以得到Ctrl-x 可能吗?这应该是您要找的。只需将冷却时间的值替换为您可以接受的按钮按下间隔时间 CtrlReplacement(key) { static cooldown := 1000 ; milliseconds If (A_PriorHotkey == A_ThisHotkey &

我的Ctrl键坏了。我正在寻找以下解决方案:

x=Ctrl-x

其中x是任意键(包括F1、F2等)

换句话说,如果我连续按任意键(比如x)两次(即两次按之间的时间小于一定数量),我可以得到Ctrl-x


可能吗?

这应该是您要找的。只需将
冷却时间
的值替换为您可以接受的按钮按下间隔时间

CtrlReplacement(key) {
    static cooldown := 1000 ; milliseconds
    If (A_PriorHotkey == A_ThisHotkey && A_TimeSincePriorHotkey < cooldown) {
        Send, {Ctrl Down}{%key%}{Ctrl Up}
    } Else {
        Send, {%key%}
    }
}
keys := ["a","x","c","z","f","b","s","w","q","v","g","h","t","r","e","k","i","]","SPACE","F1","F2","F3","F4"]
For _,key in keys {
    func := Func("CtrlReplacement").Bind(key)
    Hotkey, $%key%, % func
}
对于已映射的按键,此版本将等待冷却时间结束,如果没有再次按下按键(并立即连续按下),则会发送一次原始按键。否则,它将发送ctrl+键

编辑2 根据OP的评论,这里是第三个版本,它设置了(几乎)所有键盘字符的延迟,这使得ctrl变体更加符合人体工程学/直观

global keyDelay := 300 ; milliseconds
RunFuncWithDelay(func) {
    SetTimer, % func, -%keyDelay%
}
SendDefaultKey(key) {
    Send, {%key%}
}
CtrlReplacement(key) {
    static keyFunctions := []
    If (!keyFunctions.HasKey(key)) {
        keyFunctions[key] := Func("SendDefaultKey").Bind(key)
    }
    func := keyFunctions[key]
    If (A_PriorHotkey == A_ThisHotkey && A_TimeSincePriorHotkey < keyDelay) {
        SetTimer, % func, Off
        Send, {Ctrl Down}{%key%}{Ctrl Up}
    } Else {
        RunFuncWithDelay(func)
    }
}
Setup() {
    ; Add/Remove affected characters here
    allkeys := ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","``","1","2","3","4","5","6","7","8","9","0","-","=","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","~","!","@","#","$","%","^","&","*","(",")","_","+","[","]","{","}","\","|",";",":","'","""",",","<",".",">","/","?","ENTER","DEL","SPACE","TAB","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","NumpadAdd","NumpadClear","NumpadDel","NumpadDiv","NumpadDot","NumpadDown","NumpadEnd","NumpadEnter","NumpadHome","NumpadIns","NumpadLeft","NumpadMult","NumpadRight","NumpadSub","NumpadUp"]
    ; The characters below will overwrite the above mappings
    ctrlkeys := ["a","b","c","e","f","g","h","i","k","q","r","s","t","v","w","x","z","F1","F2","F3","F4","]","SPACE"]
    For _,key in allkeys {
        keyfunc := Func("SendDefaultKey").Bind(key)
        delayfunc := Func("RunFuncWithDelay").Bind(keyfunc)
        Hotkey, $%key%, % delayfunc
    }
    For _,key in ctrlkeys {
        keyNum := Asc(key)
        func := Func("CtrlReplacement").Bind(key)
        Hotkey, $%key%, % func
    }
}
Setup()
全局键延迟:=300;毫秒
带延迟的运行函数(func){
设置计时器,%func,-%keyDelay%
}
SendDefaultKey(密钥){
发送,{%key%}
}
CtrlReplacement(钥匙){
静态键函数:=[]
如果(!keyFunctions.HasKey(键)){
keyFunctions[key]:=Func(“SendDefaultKey”).Bind(key)
}
func:=键函数[键]
If(A_prior热键==A_this热键&&A_timesinceprior热键
当然可以。您希望哪些键可以实现这一点?您需要列出一个列表。@0x464e谢谢您的回复,我主要需要这些键:a、x、c、z、f、b、s、w、q、v、g、h、t、r、e、k、I、]、空格、F1、F2、F3、F4。您打算保留键的原始功能吗?假设您需要。@0x464e、 当然,我想保留按键的原始功能。更准确地说,如果没有检测到双按键,我希望这些按键能够发挥其原始功能。当然,但这并不容易。从第一次按键开始会发生什么?直到x时间量过去之后才发生任何事情?如果在x时间量之前按下另一个键会怎么样时间不多了?我可能会建议对双击行为进行一些开/关切换。可能只有在按住其他一些键或简单的开/关开关或其他什么的时候。非常感谢。第二个解决方案与我的初始问题相对应。一个可能的改进是等到倒计时结束后再开始输入下一个非键。因为例如,如果您按“f”,则在倒计时之前按“,”,结果将是“f”,而不是“f”。再次感谢您。一种相对简单的方法是在
Setup()中添加第二个数组
使用所有这些键,然后将SendDefaultKey函数与每个键绑定,使用
设置计时器,%sendDefaultKeyFunc,-%cooldown%
使延迟相同。我在帖子中忽略了提及,但是
设置计时器中的数字为负值会使计时器在延迟过期后只触发一次。我很抱歉我添加了一个版本,我相信它符合您的额外改进建议。非常感谢。我遇到的唯一问题是,如果您以非常快的速度键入两次非CtrKey(例如字母
l
,您只会得到一个
l
)。无论如何,谢谢你,我接受了你的回答。我的想法有一些局限性,为了打字过程顺畅,
keyDelay
不应该太大,否则会有令人讨厌的延迟。如果
keyDelay
太小,很难启动
CtrlReplacement
函数。我发现实验值100-125相当不错,两者都取决于每个人的自然打字速度。即使有了这个值,我们也会尝试意外触发
CtrlReplace
SendDefaultKey
功能。当然,这些限制和不便是由我的想法而不是您的代码造成的。
global keyDelay := 300 ; milliseconds
RunFuncWithDelay(func) {
    SetTimer, % func, -%keyDelay%
}
SendDefaultKey(key) {
    Send, {%key%}
}
CtrlReplacement(key) {
    static keyFunctions := []
    If (!keyFunctions.HasKey(key)) {
        keyFunctions[key] := Func("SendDefaultKey").Bind(key)
    }
    func := keyFunctions[key]
    If (A_PriorHotkey == A_ThisHotkey && A_TimeSincePriorHotkey < keyDelay) {
        SetTimer, % func, Off
        Send, {Ctrl Down}{%key%}{Ctrl Up}
    } Else {
        RunFuncWithDelay(func)
    }
}
Setup() {
    ; Add/Remove affected characters here
    allkeys := ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","``","1","2","3","4","5","6","7","8","9","0","-","=","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","~","!","@","#","$","%","^","&","*","(",")","_","+","[","]","{","}","\","|",";",":","'","""",",","<",".",">","/","?","ENTER","DEL","SPACE","TAB","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","NumpadAdd","NumpadClear","NumpadDel","NumpadDiv","NumpadDot","NumpadDown","NumpadEnd","NumpadEnter","NumpadHome","NumpadIns","NumpadLeft","NumpadMult","NumpadRight","NumpadSub","NumpadUp"]
    ; The characters below will overwrite the above mappings
    ctrlkeys := ["a","b","c","e","f","g","h","i","k","q","r","s","t","v","w","x","z","F1","F2","F3","F4","]","SPACE"]
    For _,key in allkeys {
        keyfunc := Func("SendDefaultKey").Bind(key)
        delayfunc := Func("RunFuncWithDelay").Bind(keyfunc)
        Hotkey, $%key%, % delayfunc
    }
    For _,key in ctrlkeys {
        keyNum := Asc(key)
        func := Func("CtrlReplacement").Bind(key)
        Hotkey, $%key%, % func
    }
}
Setup()