鼠标有时候在我单击一次时会双击。

我有一个问题,变成了一个噩梦,以至于我在考虑完全放弃Ubuntu并尝试其他东西可能会更容易。我有一台运行Ubuntu 12.04的HP电脑。当我用鼠标左键点击时,它有时候会双击(大概有50%的时间)。
到目前为止,这已经导致:随机发送未完成的电子邮件,随机突出显示和删除我不想删除的内容(非常令人沮丧),随机删除两个浏览器标签而不是一个(多次发生),还有最令人讨厌的是,在桌面上移动窗口或从终端窗口剪切和粘贴时非常非常令人沮丧的终端用户体验。谢天谢地有Alt-F7 —— 但我不想为我使用的每个程序以及操作系统学习键盘快捷键(无法复制粘贴对我来说是个很大的损失)。
我不是唯一遇到这个问题的人,但通过搜索可以看出可能有多个原因;我在网上读过的解决方法都没有对我起作用。让我把所有事情都过一遍,包括对其他人有效但对我无效的修复方法。哦,对了——我有一个惠普光学鼠标。
  • 这不是坏了的鼠标。我已经在我的系统上试过两只鼠标,它们都有同样的问题。这两只鼠标在我家里的笔记本电脑上,也安装了Ubuntu 12.04,运行得很好。

  • 我的/etc/X11/xorg.conf 只有几行代码,没有"InputDevice"部分。

  • 我没有hald,也没有安装hal软件包。

  • 这个问题大约一周前开始出现,并没有变得更好或更糟。

  • 我绝望地升级到了12.10,但这并没有解决问题,而且现在我正在使用一个非LTS版本的发行版(所以对我来说并不理想 :-\ )

但这让我的系统非常难用。

可能重要的更新:我尝试使用xev进行一些调查。在我看来,这似乎是鼠标的连接出了问题 - 这种情况常见吗?我可以按住鼠标按钮,然后得到(鼠标点击)(暂停)(鼠标释放)(非常非常短的暂停)(鼠标点击)(暂停)(鼠标释放)(非常非常短的暂停)(鼠标点击)等等。我想知道其他操作系统是否会说“你不能在0.05秒内释放然后再次点击,所以那肯定是个故障,我会假设按钮从未释放”。我能告诉Ubuntu忽略释放然后几乎立即再次点击的事件吗?

这看起来确实像是一个鼠标问题。也许我应该找出一个更新的鼠标?我只试过很旧的鼠标 :-\


1你在Launchpad上报告过这个问题吗? - Alvar
你能回忆起一周前发生的事情吗,当一切开始的时候? - hytromo
一周前发生的事情正是每周都会发生的事情——我只需点击“安装升级”,偶尔还要点击“重新启动计算机以完成安装”。这个系统是原封不动的——我想除了默认安装的几个软件包外,我只安装了一些我需要的软件来运行SparkleShare。 - Kevin Buzzard
1@Alvar:关于这个问题,Launchpad上似乎存在一些混淆。我的总体印象是,有些人遇到了这个问题,原因是他们的鼠标坏了;有些人遇到了这个问题,是由于罗技驱动程序的原因;还有些人遇到了这个问题,原因则可能在其他地方。我会尽力报告并减少干扰声音... - Kevin Buzzard
我遇到了一个相关的问题(https://superuser.com/a/334547/239311),起初我以为是鼠标和Firefox手势的组合出了问题,但后来发现是鼠标上的侧边按钮触发了“Firefox返回”功能。 - Matija Nalis
我使用了一台强力吸尘器。我不使用无用的鼠标。幸运的是,由于强大的吸力,没有东西断裂,按键也再次正常工作。通过xev进行了测试(https://askubuntu.com/a/322915/1017209)。 - SL5net
现在对我来说突然好多了,因为有了正确的鼠标(我同时使用两个,有时候三个)。新的Ubuntu版本1已经发布并且我已经更新了(其中一个鼠标已经拔掉了)。对我来说,简单的测试就是拖动窗口。通常情况下,如果在拖动过程中鼠标双击,这个操作不会很顺畅。1:Kubuntu 22.04 内核版本:5.15.0-56-generic(64位) - SL5net
8个回答

经过在受影响的机器上使用xev进行广泛测试,并在各个系统上切换不同的鼠标后,我相信我已经解决了这个问题。当然,结果因人而异。
我的解决方案是:鼠标坏了。
更准确地说,点击时激活的连接器可能有点老旧或脏乱之类的,有时候在长按按钮时会出现连接断开再次连接的情况,从而导致双击的问题。
反对:但是当我将鼠标插入我的Windows机器时,它工作正常!
反驳:将以下伪代码行“如果用户在0.05秒内取消单击鼠标然后再次单击,则可能是脏连接器,所以我们忽略它”放入驱动程序或操作系统中不是很简单吗?因此,如果您将鼠标切换到运行其他操作系统和/或在不同硬件上使用其他驱动程序的计算机(即使使用相同的操作系统,您也可能会使用不同的硬件,对吧?),您可能会得到不同的结果,对吗?
反对:但是我尝试了另一个旧鼠标,并且出现了相同的问题!
反驳:两个来自同一家公司的旧鼠标竟然以相同的方式损坏,真是令人惊讶,对吧?而且,因为第二个您尝试的旧鼠标在插入不同的硬件时没有出现任何问题(参见上一个反驳),所以您从未注意到这一点。
如果你真的不相信你的鼠标坏了,那就测试一下吧。
$ xev

然后找到黑色背景的方块,点击它,观察输出。你确定,总是只会得到一个干净的“点击”,没有其他任何东西吗?我经常会得到一个干净的点击,但偶尔也会出现一个“弹跳”(点击-取消点击-点击)。或许更好的是:
$ xev | grep ButtonRelease

现在将鼠标插入带有黑色轮廓的方框中(或任何该窗口内的位置),点击并松开按钮20次。每次释放按钮时,您应该会看到一个“ButtonRelease”行,而其他时间则不会。我偶尔会在点击时出现这种情况。
噩梦结束了。

我有两只完全相同的鼠标,最近注意到它们出现了意外的点击问题,我不确定它们是否只是在同一周“坏掉”。你的xev测试没有给我任何异常结果,但我不禁想知道是否还有其他原因? - Tom Brossman
对于一台机器上有两只鼠标,而其中一只无法工作,另一只却能在另一台机器上正常运行,我非常怀疑是否存在问题。我相信肯定有人认为这不仅仅是“鼠标都坏了,操作系统也无法补偿,其他操作系统也一样”的问题。然而,今天早上我果断换了一只鼠标——我的系统又恢复正常了,而上周我还坚信鼠标不可能是问题所在,但事实证明它确实是。 - Kevin Buzzard
2我花了大约5-10分钟与xev玩耍,并观察输出结果。不断地点击和取消点击,等等,但有时我在没有取消点击的情况下会偶尔出现意外的取消点击。我还要说一下,在一个80x24的终端窗口中查看xev的输出可能会非常误导人,因为"取消点击-点击"可能会导致xev输出整整一页的信息,如果取消点击和点击发生得足够快(就像在我的情况下),你甚至可能都没注意到xev的输出,因为它几乎和上一页完全一样。 - Kevin Buzzard
12更好的方法是 xev | awk '/ButtonRelease/ {print $1,i++}' - arekolek
对我来说,这表现为当我在鼠标滚轮上向上滚动时,“按钮3”(右键)偶尔发送一个信号。真是奇怪。 - carbocation
在用一个简单的亚马逊鼠标替换掉那个劣质鼠标之后,这个问题得到了解决,证实了命令是由那个劣质鼠标发送的。你的帖子帮助我找到了答案。 - carbocation
在购买另一只鼠标之前,先看看@ks1322的答案。这个答案让我省了一趟商店的旅程。 - Jon Hulka
我不想买一只新鼠标,所以我采用了旧任天堂游戏机的技巧。我在鼠标左右键之间用力吹气。它又完美地工作了! - musicin3d
在罕见的情况下,这也可能与浏览器或软件问题有关。不仅我的鼠标会双击,而且当我在使用YouTube尝试暂停或开始视频时,我的空格键有时也会被双击。 - user

禅与鼠标维护。似乎很多人在单击时出现鼠标双击的问题。鼠标按钮是微动开关。事实上,开关接触会反弹,但它们实际上是摩擦。我们仍然称之为反弹。由于某种原因,程序员在这个问题上犯了错误。在读取之前,应该应用足够长的等待时间来使接触点稳定。
无关紧要的是,在一个样本上,我的解决方案是在开关接触点上放置电容器。我使用了一个0.1uF的电容器,没有特别的原因,只是因为我有一个小尺寸的电容器可以很好地安装在鼠标内部。我没有进行任何复杂的停留时间、时间常数或决策水平的分析,以找到最佳值。不同的型号将具有不同的参数。
我已经使用这种修改方法一段时间了,到目前为止问题还没有再次出现。
申请这个修改。找一个体积较小的电容器,适合放在鼠标壳内。我用了一个0.1uF的电容器,因为我有一个,并且这个数值很好,但其他数值可能也可以使用,但不要选择太大或太小的。什么是太大或太小的范围需要通过实验来确定。太大可能会影响到预期的双击效果,太小则无法达到所需效果。我将电容器的一条腿焊接在一个方便的位置上,不会与鼠标内部结构相冲突,在电路板的铜面上连接到0伏特平面(如果你愿意,也可以称之为地平面)。我用一根细线将电容器的另一条腿连接到开关的活动端。我使用了一个腿比较短的回收元件。新的元件可能腿长足够到达所需位置。你需要一把适合的尖头焊铁来完成这个工作。
如果你不了解电容器。一个0.1uF的电容器可能被标记为0.1uF、104、100nF或者带有棕色、黑色、黄色条纹。表面贴装型也是一个不错的选择。用一些细线将其连接起来。可以用胶水将其固定在电路板的连接面上。
我有一个备选方案,如果当前的计划最终失败了,下次我可以尝试一下。用一个SPST PCB安装的触摸薄膜开关替换微动开关应该能解决问题。这种开关常用于键盘和按键板,不会出现这个问题。它的尺寸与微动开关完全不同。有一种高度为7毫米的开关可供选择,与现有的微动开关高度相同。如果使用更小的开关,需要将其加到正确的高度。将开关腿弯成直角,用胶水粘贴到电路板上,使得开关的执行器与微动开关的执行器所在位置对齐。鼠标按钮必须击中正确的位置。用一些细线将开关接点连接起来,理论上应该都没问题。

6虽然你的回答是100%正确的,但这是一个软件问答网站,不是硬件问答。所以请: 1/ 添加一个尊重的警告,说明你正在为一个软件问题提供硬件解决方案, 2/ 缩短你的回答 3/ 添加一些关于如何操作的图片链接 4/ 应该是µF,而不是uF。 - Fabby
@Fabby 你的建议(1)和(3)非常好,但(2)不太好,并且(3)有点琐碎/不必要。同时显得有点讽刺/简短。你应该试着对新用户友好一些! :) - user606179
@Joe 1/ 看看评论的点赞数。2/ 是的,这是一种没有任何客套话的电报风格,所以可能可以更好一些。为了辩护:我是一个沃隆,不是人类,我还在努力培养我的同理心... ;-) - Fabby
重要的是硬件出了问题。去抖动必须在硬件中实现,因为所需的去抖时间取决于实际的硬件实现,所以不能安全地使用软件来实现。通常问题出在低质量的微动开关上,所以如果你打算开始焊接东西,最好的方法通常是直接更换质量差的微动开关。添加电容器实际上会增加去抖滤波时间,并且使已经部分失效的开关能够更长时间地使用。 - Mikko Rantalainen

我为Ubuntu 14.10构建了一个修补过的xserver-xorg-input-evdev。我使用了来自http://blog.guntram.de/?p=16的说明(可以在这里这里找到补丁),以及Debian的打包手册。
下面是我关于构建软件包的笔记。
#!/bin/bash
# http://blog.guntram.de/?p=16
#

apt-get build-dep xserver-xorg-input-evdev

dquilt="quilt --quiltrc=${HOME}/.quiltrc-dpkg"

wget --output-document=evdev-debounce.patch http://blog.guntram.de/?ddownload=20
apt-get source xserver-xorg-input-evdev

cd xserver-xorg-input-evdev-*

$dquilt new debounce.patch
$dquilt add include/evdev-properties.h src/Makefile.am src/debounce.c src/evdev.c src/evdev.h src/debounce.c
patch -p1 <../evdev-debounce.patch

$dquilt refresh
$dquilt header -e

debuild -us -uc -b
cd ..

sudo dpkg -i xserver-xorg-input-evdev_*.deb

好消息:它起作用了。 坏消息:它并不总是有帮助。我的鼠标按钮接触不良,需要延迟200毫秒,这使我无法进行双击操作。另一只反弹的鼠标却开始正常工作。
编辑:感谢@MatijaNalis,修补程序的获取步骤可能是:
wget https://aur.archlinux.org/packages/xf/xf86-input-evdev-debounce/xf86-input-evdev-debounce.tar.gz
tar xzf xf86-input-evdev-debounce.tar.gz
# ...
patch -p1 < ../xf86-input-evdev-debounce/debounce.patch

1脚本需要更改 - "dquilt new" 缺少 "$","patch" 应该在 "$dquilt add" 之后和 "$dquilt refresh" 之前,并且博客 blog.guntram.de 上的补丁已经过时,应该使用来自 aur.archlinux.org 的其他补丁。还应添加 "apt-get build-dep xserver-xorg-input-evdev"。此外,应该使用 quilt 环境变量而不是(未指定的)配置文件 - https://wiki.debian.org/UsingQuilt。否则,看起来是修复鼠标问题的好方法... - Matija Nalis
5libinput 1.9增加了一个去抖动功能(https://unix.stackexchange.com/a/451864/116842)。 - Jérôme


我遇到了一个额外按钮点击两次的问题。 由于我已经使用xbindkeys将其映射(有关更多信息,请参见如何为所有鼠标按钮分配操作?),我的解决方案是更改~/.xbindkeysrc中的条目,如下所示:
"if [ ! -e /dev/shm/button ]; then touch /dev/shm/button; /usr/bin/xte 'keydown Control_L' 'key Page_Down' 'keyup Control_L'; sleep 0.2; rm  /dev/shm/button; fi"
b:7

这将在每次按钮按下时在/dev/shm/(我希望它在RAM上)创建一个“lockfile”,并在0.2秒后删除它。并且xte命令应该在鼠标点击时执行,并且在0.2秒内不应该执行两次。
(只是想分享一下我的解决方案,以防有人想复制或修复它。)

这是一个非常好的解决方案,适用于鼠标发送连续的ButtonPress/ButtonRelease事件流,但你希望将其转换为单个事件的情况。这种情况通常发生在微软蓝牙鼠标和倾斜滚轮按钮上。 - Leo Alekseyev

在我的情况下,问题出在硬件上,更准确地说是鼠标按钮微动开关的一些机械问题。
我有两只鼠标出现了这个问题:一只是老款的罗技m-uv69,另外一只是我大约一年前买的另一只鼠标。我成功修复了它们,而且并不费力。具体步骤如下:
- 取下鼠标顶盖 - 直接快速按下微动开关的小按钮多次
之后,几乎所有意外的双击问题都消失了。我不知道导致微动开关内部出现问题的具体原因。可能是脏了或者其他什么原因,而迅速按下它可以清除污垢。

喷洒WD40对于许多问题都有神奇的作用,包括解决耳机音量控制轮发出嘎嘎声的问题,也可以修复鼠标点击的问题...
测试结果非常快速,无需打开鼠标或耳机,只需喷洒一下就能恢复正常...

有一个软件漏洞,截至2014年6月还没有修复。并不是所有的鼠标型号都会出现这个问题。我的罗技鼠标没事,但大多数其他品牌的鼠标无论你怎么做都会失败。

这个问题适用于RHEL、CentOS和Ubuntu。所有的鼠标在纯Windows系统上都能正常工作,但在KVM上仍然存在同样的问题。

目前还没有解决方案,开发人员已经知道这个问题。

祝好。 Don.


1你能在这个错误上添加一个链接并提供一些背景吗? - Oli
2https://bugs.launchpad.net/system76/+bug/602809 - Victor Sergienko
3正如其他答案(和错误报告)所示,这实际上不是一个错误,而是一个缺失的功能。Windows默认对鼠标进行去抖动滤波,而Linux则没有。 - Hjulle