Ubuntu Wayland下Python按键监听在激活外部程序窗口时失效
解决Wayland下Python监听Lutris/Retroarch窗口按键失效的问题
问题根源
Ubuntu 22.04默认使用Wayland显示服务器,它的安全机制和输入路由逻辑直接导致了这个问题:
- Wayland默认禁止普通程序监听其他窗口的输入事件,尤其是当目标窗口(比如Retroarch)获得焦点时,全局输入监听会被阻断,这是为了防止恶意程序窃取输入信息。
- Lutris启动的Retroarch通常会创建独占的输入上下文,甚至直接访问硬件输入设备,绕过桌面环境的输入分发流程,导致Python脚本根本接收不到按键事件。
可行解决方案
1. 临时切换到Xorg(最简单有效)
登录Ubuntu时,点击用户名旁边的齿轮图标,选择Ubuntu on Xorg登录。Xorg没有Wayland的严格输入限制,你现有的pynput/keyboard代码可以直接正常工作。
2. Wayland下给脚本授予输入监听权限
Wayland中,要让程序能捕获全局输入,需要赋予它系统级权限:
- 运行脚本时使用
pkexec:
输入系统密码后,脚本就能获得全局输入监听权限,在Retroarch窗口聚焦时也能捕获按键。pkexec python3 your_script.py
注意:这种方式会给脚本较高权限,只运行你完全信任的脚本。
3. 直接在Retroarch中绑定热键触发脚本
不需要全局监听,直接让Retroarch在收到指定按键时执行你的脚本:
- 打开Retroarch,进入设置 > 输入 > 热键
- 为某个按键(比如F12)设置自定义热键
- 打开Retroarch的配置文件
retroarch.cfg,添加一行:
这样在Retroarch窗口按下F12时,会直接触发你的脚本逻辑。input_hotkey_f12 = "exec:/path/to/your/python/script.py"
4. 用libinput/evdev直接读取硬件输入(进阶)
绕过桌面环境的输入路由,直接读取键盘设备的原始事件,需要root权限:
- 先安装依赖:
sudo apt install libinput-tools python3-evdev - 列出所有输入设备,找到你的键盘:
记下键盘对应的设备路径(比如libinput list-devices/dev/input/event3) - 用evdev库编写监听代码:
from evdev import InputDevice, categorize, ecodes # 替换成你的键盘设备路径 dev = InputDevice('/dev/input/event3') for event in dev.read_loop(): if event.type == ecodes.EV_KEY: key_event = categorize(event) if key_event.keystate == key_event.key_down: print(key_event.keycode) break # 捕获一次按键后退出,按需修改 - 运行脚本时需要root权限:
sudo python3 your_script.py
内容的提问来源于stack exchange,提问作者Miko
相关产品推荐
相关产品推荐

