运行VNC服务器时,Python应用如何区分本地触摸与远程鼠标点击事件?
可以区分本地触摸与远程VNC鼠标点击事件
以下是几种适用于你的Python(PsychoPy)应用的实现方法:
方法1:基于Pyglet的设备ID识别(PsychoPy默认底层之一)
- 先通过终端命令
xinput list列出系统所有输入设备,找到触摸屏的设备ID/名称,以及x11vnc创建的虚拟鼠标设备ID/名称(通常名称包含"VNC"或"x11vnc"关键词)。 - 在PsychoPy中直接调用Pyglet的事件处理接口,捕获输入事件的设备信息:
注:部分旧版本Pyglet的device属性可能需要通过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()event.device获取,需根据实际版本调整。
方法2:使用python-xlib直接捕获X11事件
通过python-xlib库绕过PsychoPy的上层封装,直接读取X11原始输入事件,每个事件会携带输入设备的ID:
- 安装依赖:
pip install python-xlib - 编写代码捕获并判断事件来源:
注:X11事件的设备ID字段可能因系统配置略有差异,需结合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()xinput test <设备ID>命令验证事件格式。
方法3:配置x11vnc添加独特输入标识
修改x11vnc的启动参数,让其创建的虚拟鼠标带有独特的属性,便于应用识别:
- 启动x11vnc时添加
-name "VNC_Remote_Mouse"参数指定设备名称,或使用-pointer_mode 2让虚拟鼠标使用独特映射。 - 在应用中通过
xinput list动态获取设备名称,结合方法1的Pyglet事件处理逻辑进行判断。
内容的提问来源于stack exchange,提问作者Stew
相关产品推荐
相关产品推荐

