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