微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在自动热键结果中双击键 ctrl+key 稍微解释一下

如何解决在自动热键结果中双击键 ctrl+key 稍微解释一下

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

x x = Ctrl-x

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

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

有可能吗?

解决方法

这应该是你要找的。只需将 cooldown 的值替换为您在按下按钮之间可接受的时间。

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
}

稍微解释一下。

我们使用 Hotkey 函数而不是典型的 F1:: (Double-colon label) 语法,以便在运行时而不是编译时生成这些(这使得代码更小并且没有重复)。你可以把它们全部写出来,但这会很麻烦。

$ 之前的 %key% 表示虚拟按键不会触发此热键(即热键不会自行触发),因此如果您手动编写它们,您需要在每个之前添加一个 $

然后该函数检查热键是否与之前按下的热键相同,以及自上一个按下以来的时间是否小于预设时间(cooldown)。如果是,它发送 ctrl+键组合。否则,它只会发送密钥本身(因此保留了密钥的原始功能)。

你也可以调整这个函数,让它等到冷却时间过去,如果没有再次按下这个键,然后只有它才会发送原始键。虽然这需要更多的技巧。如果这就是您的意图,请告诉我,我也可以尽力帮助您。

编辑

无论如何我还是做了那个版本:)

SendDefaultKey(key) {
    Send,{%key%}
}
CtrlReplacement(key) {
    static cooldown := 300 ; milliseconds
    static keyFunctions := []
    If (!keyFunctions.HasKey(key)) {
        keyFunctions[key] := Func("SendDefaultKey").Bind(key)
    }
    func := keyFunctions[key]
    If (A_PriorHotkey == A_ThisHotkey && A_TimeSincePriorHotkey < cooldown) {
        SetTimer,% func,Off
        Send,{Ctrl Down}{%key%}{Ctrl Up}
    } Else {
        SetTimer,-%cooldown%
    }
}
Setup() {
    keys := ["a","F4"]
    For _,key in keys {
        func := Func("CtrlReplacement").Bind(key)
        Hotkey,% func
    }
}
Setup()

对于已映射的键,此版本将等待冷却时间结束,如果未再次按下键(并立即连续按下),它将发送一次原始键。否则,它会发送 ctrl+key

编辑 2

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

global keyDelay := 300 ; milliseconds
RunFuncWithDelay(func) {
    SetTimer,-%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,{Ctrl Down}{%key%}{Ctrl Up}
    } Else {
        RunFuncWithDelay(func)
    }
}
Setup() {
    ; Add/Remove affected characters here
    allkeys := ["a","d","j","l","m","n","o","p","u","y","``","1","2","3","4","5","6","7","8","9","0","-","=","F4","F5","F6","F7","F8","F9","F10","F11","F12","~","!","@","#","$","%","^","&","*","(",")","_","+","[","{","}","\","|",";",":","'","""",","<",".",">","/","?","ENTER","DEL","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","SPACE"]
    For _,key in allkeys {
        keyfunc := Func("SendDefaultKey").Bind(key)
        delayfunc := Func("RunFuncWithDelay").Bind(keyfunc)
        Hotkey,% delayfunc
    }
    For _,key in ctrlkeys {
        keyNum := Asc(key)
        func := Func("CtrlReplacement").Bind(key)
        Hotkey,% func
    }
}
Setup()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。