返回首页

键盘不灵先别急着扔,万一还有救呢?

2026-10-01 捣鼓点啥 全文约 2823 字 · 预计阅读 10 分钟
扫码手机读

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

出问题的机械键盘:黑色键帽橙色字符,看着挺健康,其实毛病出在软件层

就是这台机器上正在服役的键盘。虽然买了有三五年了,但是其实也没怎么用。

症状

最近打字老是出错,而且是那种很典型的错——同一个字母莫名其妙多出来一个。快速连打一段拼音,不修正的话,出来的是这样:

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 级(就是开机就要加载的)。这种东西不能硬删文件,删了可能直接蓝屏开不了机。

所以正确做法是:只改键盘这一环的配置,其他一个字都不碰。

具体两步:

  1. 把键盘类的 UpperFilters 从 aswKbd, kbdclass 改成只剩 kbdclass
  2. 把 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 省电),结果也是错的
  • 真正的凶手,是一个"你根本没往那个方向想"的东西——杀毒软件的键盘监控驱动

而且这个凶手还挺讽刺的:它装上去的初衷是保护你(防键盘记录木马),结果反而破坏了你最基础的功能。

几个可以带走的经验:

  1. 错误有规律,就能定位。是集中还是分散、是多字还是漏字、快打还是慢打都出错——这几个问题的答案,能一层层把范围缩小。
  2. 连打同一个键是个很好用的测试。它能一口气排除掉"相邻键干扰"“物理磨损"一大票可能。
  3. 别急着换硬件。键盘这种输入设备,问题常常出在软件层——尤其是你装了安全软件的时候。
  4. 过滤驱动(UpperFilters)是个值得记住的名词。以后遇到输入异常、鼠标异常、磁盘异常,都可以先去这里看看有没有不认识的家伙挂着。

至于 Avast 本身——这次只是摘了它一个键盘驱动。全卸载的事,以后再说吧。老吴早晚要修了它。