使用python-uinput无法向uinput写入触摸事件求助
解决uinput模拟多点触摸无响应的问题
嘿,我来帮你搞定这个触摸模拟的问题!你想用摄像头追踪手部实现双指针触摸,但现有代码没效果,核心问题在于你用了单点指针的事件而非多点触摸(MT)专用事件,另外INPUT_PROP_POINTER的替代方案也需要调整,下面一步步来修正:
为什么你的代码没效果?
普通的ABS_X/ABS_Y是给单点指针(比如鼠标)用的,触摸屏这类多点设备需要使用ABS_MT_*系列事件来区分不同触点,系统才能识别为触摸输入。另外你选的BTN_TOOL_PEN是针对手写笔的,手指触摸应该用BTN_TOOL_FINGER。
修正后的双指针触摸模拟代码
import uinput import time # 定义多点触摸需要的事件 events = [ uinput.BTN_TOUCH, uinput.BTN_TOOL_FINGER, # 手指触摸,替代BTN_TOOL_PEN uinput.ABS_MT_SLOT, # 切换触点槽位 uinput.ABS_MT_TRACKING_ID,# 唯一标识每个触点 uinput.ABS_MT_POSITION_X, # 触点X坐标 uinput.ABS_MT_POSITION_Y, # 触点Y坐标 ] # 设置设备属性,替代INPUT_PROP_POINTER,用DIRECT表示直接触摸设备 props = [uinput.INPUT_PROP_DIRECT] # 创建uinput设备 device = uinput.Device(events, props=props) time.sleep(1) # 给系统时间识别设备 # 模拟双触摸点按下 # 第一个触点(槽位0) device.emit(uinput.ABS_MT_SLOT, 0) device.emit(uinput.ABS_MT_TRACKING_ID, 1) # 给第一个触点分配ID1 device.emit(uinput.ABS_MT_POSITION_X, 100) device.emit(uinput.ABS_MT_POSITION_Y, 200) # 第二个触点(槽位1) device.emit(uinput.ABS_MT_SLOT, 1) device.emit(uinput.ABS_MT_TRACKING_ID, 2) # 给第二个触点分配ID2 device.emit(uinput.ABS_MT_POSITION_X, 300) device.emit(uinput.ABS_MT_POSITION_Y, 400) # 触发触摸按下事件 device.emit(uinput.BTN_TOUCH, 1) device.syn() # 同步事件,让系统处理 time.sleep(2) # 模拟触摸移动(可选) device.emit(uinput.ABS_MT_SLOT, 0) device.emit(uinput.ABS_MT_POSITION_X, 150) device.emit(uinput.ABS_MT_POSITION_Y, 250) device.emit(uinput.ABS_MT_SLOT, 1) device.emit(uinput.ABS_MT_POSITION_X, 350) device.emit(uinput.ABS_MT_POSITION_Y, 450) device.syn() time.sleep(1) # 释放触摸点 device.emit(uinput.BTN_TOUCH, 0) # 清除每个触点的tracking ID(设为-1) device.emit(uinput.ABS_MT_SLOT, 0) device.emit(uinput.ABS_MT_TRACKING_ID, -1) device.emit(uinput.ABS_MT_SLOT, 1) device.emit(uinput.ABS_MT_TRACKING_ID, -1) device.syn() # 关闭设备 device.destroy()
关键要点说明
- ABS_MT系列事件:
ABS_MT_SLOT用于切换当前操作的触点槽位,ABS_MT_TRACKING_ID给每个触点分配唯一ID(释放时设为-1),ABS_MT_POSITION_X/Y是触点的坐标(范围需要匹配你的屏幕分辨率,比如1920x1080的话X范围0-1919)。 - 设备属性:
INPUT_PROP_DIRECT是INPUT_PROP_POINTER的合适替代,告诉系统这是一个直接触摸设备,不需要光标。 - 同步事件:每次发送完一组触点数据后,必须调用
device.syn(),否则系统不会处理这些事件。
额外注意事项
- 运行代码需要root权限(因为uinput需要访问/dev/uinput设备),所以要用
sudo python3 your_script.py执行。 - 确保你的屏幕分辨率对应的坐标范围,比如如果你的屏幕是1080p,X的最大值是1919,Y是1079,超出范围的坐标可能不会被识别。
内容的提问来源于stack exchange,提问作者ovg
相关产品推荐
相关产品推荐

