You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求修改AHK多键等待函数以支持SC扫描码与VK虚拟键码

请求修改AHK多键等待函数以支持SC扫描码与VK虚拟键码

嘿,这个需求很常见,我帮你调整一下这个Keys_Wait_Multi函数,让它完美支持VK虚拟键码和SC扫描码。原来的函数之所以不支持,是因为InputHook.KeyOpt直接传入带{SCxx}/{VKxx}的字符串时,没办法正确识别这些特殊键格式,我们需要先把这些键项拆分出来单独配置。

下面是修改后的完整函数:

Keys_Wait_Multi(keys, options := "") {
    key_pressed := false
    ih := InputHook(options)
    ih.KeyOpt("{All}", "VE")  ; 默认禁用所有键的捕获,除了我们指定的
    
    ; 拆分输入的keys字符串,处理单个键(包括SC/VK格式)
    keyList := StrSplit(keys, "{")
    for _, keyPart in keyList {
        if keyPart = ""
            continue
        ; 处理带}结尾的键(比如SC28}、VK10})
        if InStr(keyPart, "}") {
            key := "{" . StrSplit(keyPart, "}")[1] . "}"
        } else {
            ; 处理普通字符键(比如a、b、c)
            key := keyPart
        }
        ih.KeyOpt(key, "-E")  ; 启用该键的捕获
        ih.KeyOpt(key, "NS")  ; 设置不等待序列、发送原始键
    }
    
    ih.MinSendLevel := 1
    ih.OnKeyDown := (ih, *) => ih.Stop()  ; 按下指定键就停止钩子
    ih.Start()      ; 启动输入钩子
    ih.Wait()       ; 等待钩子结束
    
    ; 判断是否是因为按下目标键而停止的
    if_success := (ih.EndReason = "Stopped" ? true : false)
    return if_success
}

关键改动说明:

  • 键拆分逻辑:把传入的keys字符串按{拆分,分别处理普通字符键和带{SCxx}/{VKxx}的特殊键,确保每个键都能被KeyOpt正确识别。
  • 逐个配置键:不再一次性把整个keys字符串传给KeyOpt,而是遍历每个拆分后的键单独配置,解决了特殊键码不被识别的问题。
  • 保留原功能:原有的钩子停止逻辑、返回值判断都保留了,不会影响原本的普通字符键和功能键(比如F12)的使用。

测试示例:

你可以直接用你想要的方式调用:

if keys_wait_multi("abc{SC28}{VK10}{F12}") {
    MsgBox("you pressed one of the keys")
}

这样不管是普通字符、SC扫描码还是VK虚拟键码,都能被正确捕获啦。

备注:内容来源于stack exchange,提问作者yfjuu 0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:04:39