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

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

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

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

Post by azzvx » 26 Feb 2023, 01:57

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

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

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") 返回的仍然是按下的状态。

Top