You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:
    pkexec python3 your_script.py
    
    输入系统密码后,脚本就能获得全局输入监听权限,在Retroarch窗口聚焦时也能捕获按键。
    注意:这种方式会给脚本较高权限,只运行你完全信任的脚本。

3. 直接在Retroarch中绑定热键触发脚本

不需要全局监听,直接让Retroarch在收到指定按键时执行你的脚本:

  1. 打开Retroarch,进入设置 > 输入 > 热键
  2. 为某个按键(比如F12)设置自定义热键
  3. 打开Retroarch的配置文件retroarch.cfg,添加一行:
    input_hotkey_f12 = "exec:/path/to/your/python/script.py"
    
    这样在Retroarch窗口按下F12时,会直接触发你的脚本逻辑。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:52:06