Ubuntu下使用pynput运行Python代码无法屏蔽鼠标输入的问题解决
Ubuntu下Python禁用鼠标无效的问题分析与解决
问题原因
- 原代码仅拦截了鼠标点击事件,完全没处理移动、滚轮滚动等其他操作,所以鼠标仍能正常移动、滚动。
- 若Ubuntu使用X11桌面环境,
pynput的事件监听优先级低于系统输入处理,就算返回False,部分事件还是会被系统接收;如果是Wayland环境,pynput的输入拦截兼容性极差,基本起不了作用。
解决方法
方法一:改进pynput代码(仅X11环境可用,效果有限)
要拦截所有鼠标动作,需同时监听移动、点击、滚轮三个事件,每个事件都返回False阻止事件传递,且必须用sudo权限运行程序。
修改后的代码:
from pynput import mouse def on_move(x, y): return False # 拦截鼠标移动 def on_click(x, y, button, pressed): return False # 拦截鼠标点击 def on_scroll(x, y, dx, dy): return False # 拦截鼠标滚轮 # 监听所有鼠标事件 with mouse.Listener( on_move=on_move, on_click=on_click, on_scroll=on_scroll) as listener: listener.join()
运行命令:sudo python3 try.py
方法二:用xinput工具(X11环境下稳定可靠)
直接调用系统的xinput命令禁用鼠标设备,这是最稳妥的方式,Python通过subprocess模块执行即可。
步骤:
- 先执行
xinput list查看所有输入设备,找到你的鼠标设备名称或ID(比如PS/2 Generic Mouse)。 - 用以下代码实现禁用/恢复:
import subprocess import time # 替换成你的鼠标设备名称或ID MOUSE_DEVICE = "PS/2 Generic Mouse" def disable_mouse(): subprocess.run(["xinput", "disable", MOUSE_DEVICE], check=True) def enable_mouse(): subprocess.run(["xinput", "enable", MOUSE_DEVICE], check=True) try: disable_mouse() print("鼠标已禁用,按Ctrl+C恢复") while True: time.sleep(1) except KeyboardInterrupt: enable_mouse() print("鼠标已恢复")
运行命令:sudo python3 try.py
方法三:Wayland环境的替代方案
Wayland环境下xinput和pynput都无法正常工作,最简单的办法是登录时选择「Ubuntu on Xorg」切换到X11环境,再使用方法二。如果必须使用Wayland,需要借助libinput相关工具,实现复杂度较高,不推荐普通用户折腾。
内容的提问来源于stack exchange,提问作者Jasmine58850_01
相关产品推荐
相关产品推荐

