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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:54:07