请求修改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
相关产品推荐
相关产品推荐

