我正在尝试在没有触摸屏的 android 设备上注入事件。我正在使用用户空间输入设备(uinput)这样做,但它不起作用。
我正在使用这段代码:
fd_virtual_dev = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if (fd_virtual_dev < 0)
return die("error: open");
if (ioctl(fd_virtual_dev, UI_SET_EVBIT, EV_ABS) < 0)
return die("error: ioctl ev_abs");
if (ioctl(fd_virtual_dev, UI_SET_EVBIT, EV_SYN) < 0)
return die("error: ioctl ev_syn");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_TOUCH_M AJOR) < 0)
return die("error: ioctl ABS_MT_TOUCH_MAJOR");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_WIDTH_M AJOR) < 0)
return die("error: ioctl ABS_MT_TOUCH_MAJOR");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_POSITIO N_X) < 0)
return die("error: ioctl ABS_MT_POSITION_X");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_POSITIO N_Y) < 0)
return die("error: ioctl ABS_MT_POSITION_Y");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_TRACKIN G_ID) < 0)
return die("error: ioctl ABS_MT_TRACKING_ID");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_SLOT) < 0)
return die("error: ioctl");
if (ioctl(fd_virtual_dev,UI_SET_ABSBIT,ABS_MT_PRESSUR E) < 0)
return die("error: ioctl ABS_MT_PRESSURE");
memset(&uidev, 0, sizeof(uidev));
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-device");
uidev.id.bustype = BUS_VIRTUAL;
uidev.id.vendor = 0x0;
uidev.id.product = 0x0;
uidev.id.version = 0;
uidev.absmax[ABS_MT_TOUCH_MAJOR] = 64;
uidev.absmax[ABS_MT_WIDTH_MAJOR] = 64;
uidev.absmax[ABS_MT_POSITION_X] = 1024;
uidev.absmax[ABS_MT_POSITION_Y] = 800;
uidev.absmax[ABS_MT_TRACKING_ID] = 65535;
uidev.absmax[ABS_MT_SLOT] = 9;
uidev.absmax[ABS_MT_PRESSURE] = 64;
现在,如果我尝试发送多点触控协议 B 事件,我只能在屏幕上的伪随机点中看到一个小圆圈
我也尝试过使用协议 A 和触摸屏手机,结果相同 Alfonso