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

运行VNC服务器时,Python应用如何区分本地触摸与远程鼠标点击事件?

可以区分本地触摸与远程VNC鼠标点击事件

以下是几种适用于你的Python(PsychoPy)应用的实现方法:

方法1:基于Pyglet的设备ID识别(PsychoPy默认底层之一)

  1. 先通过终端命令xinput list列出系统所有输入设备,找到触摸屏的设备ID/名称,以及x11vnc创建的虚拟鼠标设备ID/名称(通常名称包含"VNC"或"x11vnc"关键词)。
  2. 在PsychoPy中直接调用Pyglet的事件处理接口,捕获输入事件的设备信息:
    from psychopy import visual, event
    import pyglet
    
    win = visual.Window(size=(800,600))
    
    def on_mouse_press(x, y, button, modifiers, device):
        # 对比设备ID或名称,判断是本地触摸还是远程点击
        if device.name == "你的触摸屏设备名称":
            print("本地触摸输入")
        elif device.name == "x11vnc虚拟鼠标名称":
            print("远程VNC点击")
    
    # 给窗口绑定Pyglet的鼠标按下事件
    win.winHandle.push_handlers(on_mouse_press=on_mouse_press)
    
    while True:
        if event.getKeys(keyList=['escape']):
            break
        win.flip()
    win.close()
    
    注:部分旧版本Pyglet的device属性可能需要通过event.device获取,需根据实际版本调整。

方法2:使用python-xlib直接捕获X11事件

通过python-xlib库绕过PsychoPy的上层封装,直接读取X11原始输入事件,每个事件会携带输入设备的ID:

  1. 安装依赖:pip install python-xlib
  2. 编写代码捕获并判断事件来源:
    from Xlib import X, display
    from psychopy import visual, event
    
    # 预先通过xinput list获取触摸屏和VNC虚拟鼠标的设备ID
    TOUCHSCREEN_ID = 10  # 替换为实际设备ID
    VNC_MOUSE_ID = 15    # 替换为实际设备ID
    
    d = display.Display()
    root = d.screen().root
    root.change_attributes(event_mask=X.ButtonPressMask)
    
    win = visual.Window(size=(800,600))
    
    while True:
        # 处理X11事件
        if d.pending() > 0:
            evt = d.next_event()
            if evt.type == X.ButtonPress:
                # 对比设备ID判断输入来源
                if evt.device == TOUCHSCREEN_ID:
                    print("本地触摸输入")
                elif evt.device == VNC_MOUSE_ID:
                    print("远程VNC点击")
        # 处理PsychoPy自身事件
        if event.getKeys(keyList=['escape']):
            break
        win.flip()
    win.close()
    
    注:X11事件的设备ID字段可能因系统配置略有差异,需结合xinput test <设备ID>命令验证事件格式。

方法3:配置x11vnc添加独特输入标识

修改x11vnc的启动参数,让其创建的虚拟鼠标带有独特的属性,便于应用识别:

  1. 启动x11vnc时添加-name "VNC_Remote_Mouse"参数指定设备名称,或使用-pointer_mode 2让虚拟鼠标使用独特映射。
  2. 在应用中通过xinput list动态获取设备名称,结合方法1的Pyglet事件处理逻辑进行判断。

内容的提问来源于stack exchange,提问作者Stew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:17:23