键盘不灵先别急着扔,万一还有救呢?
先说结论:老吴没用多久的一个机械键盘,最近打字总觉得十分别扭,老是感觉多字符少字符的。以为坏了,都快扔进垃圾袋了。不过一想到要买新的又得花冤枉钱,还是再折腾一下,看有救没救。最后发现,我的机械键盘一个键都没坏,原来是杀毒软件的一个驱动在捣鬼。

就是这台机器上正在服役的键盘。虽然买了有三五年了,但是其实也没怎么用。
症状
最近打字老是出错,而且是那种很典型的错——同一个字母莫名其妙多出来一个。快速连打一段拼音,不修正的话,出来的是这样:
feiliuzhiiasannqiachi,yishiyinheluojiutian. woyuchegfengguiqu,youkgqionglouyuyu.
本来想打的是「飞流直下三千尺,疑是银河落九天。我欲乘风归去,又恐琼楼玉宇」:
feiliuzhixiasanqianchi,yishiyinheluojiutian. woyuchengfengguiqu,youkongqionglouyuyu.
对比一下就很清楚:xia 打成了 ia(少个 x)、sanqian 打成 sannqian(多一个 n)、chengfeng 打成 chegfeng(少个 n)、kong 打成 kg(n 变成 g)。
看着像是"手速太快键盘跟不上"。但奇怪的地方在于:老吴打得不快的时候,也一样出错。测试的时候,老吴真的是一个手指头一个手指头慢慢点的。
第一步:到底是不是键盘坏了
遇到这种问题,多数人的第一反应是——键盘老了,该换轴了。机械键盘嘛,轴体磨损、触点接触不良,都会造成漏字重字。
所以第一步要做的是判断错误有没有规律。老吴做了三个测试。
测试一:错误集中在某几个键上吗?
把错误位置列出来:n、o、a、x、g、h。分散在键盘各个角落,左边右边上面下面都有。如果真是某颗轴坏了,错误应该密集地集中在特定几个键上,而不是这样到处跑。所以不像物理磨损。
测试二:有按键完全失灵吗?
没有。目标字母全都打出来了,一个不少。这说明触点没有断——接触不良会造成"整键丢失",而老吴遇到的是"多出一个"和"偶尔少一个"。
测试三(关键):连打同一个键,也会错吗?
这一步是转折点。老吴在记事本里按住 a 打了一长串,再按住 x 打了一长串:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
结果还是会出现 xx、oo 这种重复。
这一下就把"按键本体"排除了。因为连打同一个键的时候,根本不存在"相邻两个键互相干扰"这回事——手指只按了一个键。这时候还能多出一个字符,只可能是:同一次物理按压,被系统上报了两次。
怀疑是软件层的问题了,跟轴没关系。
第二步:查软件层
顺着"重复上报"这条线往下查,有两个常见的怀疑对象。
嫌疑一:USB 省电
Windows 有个习惯,会为了省电把空闲的 USB 设备降频甚至断电。如果键盘的轮询频率被降低了,快速连打时一次按压的"按下—抬起"间隔可能小于轮询周期,控制器就可能把一次击键读成两次。
听起来很合理,老吴一开始也认定是这个。查了电源计划里的"USB 选择性暂停",关了;查了设备管理器里每个 USB 集线器和 HID 键盘的"允许计算机关闭此设备以节约电源",也关了。
结果:没用。 因为后来老吴发现——这台机器上 USB 选择性暂停本来就是关的,白折腾一轮。这条线索排除。
嫌疑二:键盘过滤驱动
这个是真正的凶手。
Windows 的键盘输入经过一条"过滤链",大概是这个意思:
你的按键 → [某某驱动] → [某某驱动] → kbdclass(Windows 键盘类驱动)→ 系统
中间那些 [某某驱动] 就是第三方驱动挂进来的,叫"过滤驱动"。杀毒软件、输入法、按键增强工具、宏工具,都喜欢往这条链上挂东西——因为挂在这里,能看到你敲的每一个键。
老吴查了下注册表里键盘类的 UpperFilters 值:
UpperFilters = aswKbd, kbdclass
aswKbd。这就是 Avast 杀毒软件的键盘过滤驱动,它排在了 Windows 自己的键盘驱动前面。
也就是说,老吴每敲一个字,信号都要先穿过 Avast 的驱动,才轮到 Windows 处理。这就说得通了:一个杀毒软件在"实时监控你敲的每个键",而且是同步地挡在必经之路上,高速输入的时候它处理不过来,或者实现上有瑕疵,就可能重复上报。
第三步:动手
思路很简单:把 aswKbd 从过滤链里摘掉,让信号直达 Windows。
但这里有个坑——Avast 不止一个驱动。老吴数了一下,全系统一共 18 个 asw* 开头的内核驱动,其中 6 个是 BOOT 级(就是开机就要加载的)。这种东西不能硬删文件,删了可能直接蓝屏开不了机。
所以正确做法是:只改键盘这一环的配置,其他一个字都不碰。
具体两步:
- 把键盘类的
UpperFilters从aswKbd, kbdclass改成只剩kbdclass - 把
aswKbd这个服务的启动类型设为"禁用"(Start = 4)
驱动文件本身保留不动,只是不让它加载。想反悔,改回去重启就行——可逆。
第四步:踩了一路坑
理论很清晰,实操全是坑。这里记几个,以后省事。
坑一:PowerShell 脚本根本跑不起来
老吴第一版工具写的是 .ps1 脚本,结果双击一闪就没了,连日志都没写出一行。
查了半天:这台机器的 PowerShell 执行策略,LocalMachine 级别是 Restricted——这个策略下 .ps1 文件被系统级禁止运行。脚本里虽然写了 -ExecutionPolicy Bypass 想绕过,但在某些安全软件的 hook 下这个参数会被吃掉,进程直接被终止。
改法:干脆不用 PowerShell,改用纯 .bat 批处理 + reg 命令行。批处理不受执行策略约束,稳。
坑二:中文路径
脚本放在桌面的 键盘修复 文件夹里(中文名)。批处理里用 %~dp0 取自己的路径,一提权,工作目录就变成了 C:\Windows\System32,中文路径解析直接崩,脚本静默退出。
改法:日志和备份文件统统写到 %TEMP% 目录,绕开中文路径;提权也不用脚本自动做了,改成手动右键"以管理员身份运行"——最土,但最不容易出岔子。
坑三:编码
.bat 文件必须是 GBK 编码 + CRLF 换行。老吴一开始存成 UTF-8 + LF,中文注释直接乱码,批处理解析到一半就报错退出。这种坑不查编码根本看不出来。
结果
重启之后,过滤链变成了这样:
UpperFilters = kbdclass ← 干净了,aswKbd 没了
aswKbd Start = 4 ← 服务已禁用
aswKbd.sys = 保留未删
Avast 其余全套驱动,一个没动。
然后就是验证——打那段拼音。
好了。 一个字都不错。
复盘
回过头看,这事有意思的地方在于误判:
- 一开始所有人都觉得是硬件问题(键盘该换了、轴该换了)
- 中间老吴以为找到了元凶(USB 省电),结果也是错的
- 真正的凶手,是一个"你根本没往那个方向想"的东西——杀毒软件的键盘监控驱动
而且这个凶手还挺讽刺的:它装上去的初衷是保护你(防键盘记录木马),结果反而破坏了你最基础的功能。
几个可以带走的经验:
- 错误有规律,就能定位。是集中还是分散、是多字还是漏字、快打还是慢打都出错——这几个问题的答案,能一层层把范围缩小。
- 连打同一个键是个很好用的测试。它能一口气排除掉"相邻键干扰"“物理磨损"一大票可能。
- 别急着换硬件。键盘这种输入设备,问题常常出在软件层——尤其是你装了安全软件的时候。
- 过滤驱动(
UpperFilters)是个值得记住的名词。以后遇到输入异常、鼠标异常、磁盘异常,都可以先去这里看看有没有不认识的家伙挂着。
至于 Avast 本身——这次只是摘了它一个键盘驱动。全卸载的事,以后再说吧。老吴早晚要修了它。
手机扫码,在手机上打开本页