使用 ahk 的用户是否遇到过 alt 物理上释放(松开按键), 但逻辑上还是按下的状态 Topic is solved

遇到了问题?请先进行搜索(中文和英文),然后在此提问

Moderators: tmplinshi, arcticir

doit132
Posts: 2
Joined: 12 Nov 2022, 21:09

使用 ahk 的用户是否遇到过 alt 物理上释放(松开按键), 但逻辑上还是按下的状态  Topic is solved

Post by doit132 » 07 Dec 2022, 22:31

在写 ahk 脚本的时候, 使用 alt 做修饰键遇到的问题, 热键执行完毕后, alt 仍然是处于被按下状态, 这样的问题要如何解决。

问题代码:

Code: Select all

#SingleInstance Force
SetWorkingDir A_ScriptDir
SendMode("Input")
InstallKeybdHook()

!s:: insert_space_in_cn_and_en()
insert_space_in_cn_and_en() {
    A_Clipboard := ""
    Send("+{home}")
    Send("^c")
    ClipWait(0.4)
    clip_board := A_Clipboard
    ; 中英文之间加入空格
    clip_board := RegExReplace(clip_board, "([\x{4e00}-\x{9fa5}]+)([A-Za-z]+)", "$1 $2")
    clip_board := RegExReplace(clip_board, "([A-Za-z]+)([\x{4e00}-\x{9fa5}]+)", "$1 $2")
    ; 中文数字之间加入空格
    clip_board := RegExReplace(clip_board, "([\x{4e00}-\x{9fa5}]+)([0-9]+)", "$1 $2")
    clip_board := RegExReplace(clip_board, "([0-9]+)([\x{4e00}-\x{9fa5}]+)", "$1 $2")
    SendText(clip_board)
}
已知的解决方案:

1. 再次按下 alt 键即可恢复
2. 再开一个脚本, 脚本中安装键盘钩子, 可以不加任何功能, 但要能确保在后台运行, 此时的 alt 卡死现象将会得到改善
3. 启动一个计时器, 检测 alt 的逻辑状态和物理按下状态, 如果 alt 的物理状态是松开, 但逻辑状态是按下, 那么发送一个释放命令 [ 例如: send("{blind}{alt up}") ] , 参考: [如何使用 AutoHotkey 解决 Alt 键被卡住的问题 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/585645321)

问题:

1. autohotkey 检测按键的物理状态函数有时会失效, 即 getKeyState("keyname", "P") 失效, 这就导致了第 3 个解决方案有时会无效。造成这种现象出现的原因是, ahk 忽略了 alt 键的物理释放, 以至于 alt 键已经物理释放, 但是使用 getKeyState("keyname", "P") 返回的仍然是按下的状态。
Last edited by doit132 on 10 Dec 2022, 07:36, edited 3 times in total.

azzvx
Posts: 1
Joined: 26 Feb 2023, 01:52

Re: 使用 ahk 的用户是否遇到过 alt 物理上释放(松开按键), 但逻辑上还是按下的状态

Post by azzvx » 26 Feb 2023, 01:57

遇到过,在2.0RC上还是正常的,一到2.0正式版就出现了这个问题。
具体表现是send途中释放修饰键,在send完以后释放的修饰键又按下去了。不过等send完再释放修饰键就不会出问题。
后来改用SendEvent就正常了。


Post Reply

Return to “请求帮助”