求助-帮修复uinput模拟触摸抢屏幕控制权限的问题,与当前正常触摸屏操作互不影响

#include #include #include #include #include #include #include #include #include int reportkey(int fd, uint16_t type, uint16_t keycode, int32_t value) { int ret; struct input_event ev; memset(&ev, 0, sizeof(struct input_event)); ev.type = type; ev.code = keycode; ev.value = value; ret = write(fd, &ev, sizeof(struct input_event)); if (ret < 0) { printf("report key error!\n"); return ret; } /* printf("key is %d %d\n", keycode, value);*/ return 0; } int main(void) { struct uinput_user_dev uidev; int fd, ret; fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); if (fd < 0) { return fd; } //配置设备属性 ioctl(fd, UI_SET_EVBIT, EV_ABS); //支持触摸 ioctl(fd, UI_SET_EVBIT, EV_SYN); //支持同步,用于report // Touch ioctl (fd, UI_SET_EVBIT, EV_ABS); //支持触摸 ioctl (fd, UI_SET_ABSBIT, ABS_MT_SLOT); ioctl (fd, UI_SET_ABSBIT, ABS_MT_TOUCH_MAJOR); ioctl (fd, UI_SET_ABSBIT, ABS_MT_POSITION_X); ioctl (fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y); ioctl (fd, UI_SET_ABSBIT, ABS_MT_TRACKING_ID); ioctl (fd, UI_SET_ABSBIT, ABS_MT_PRESSURE); ioctl (fd, UI_SET_PROPBIT, INPUT_PROP_DIRECT); memset(&uidev, 0, sizeof(struct uinput_user_dev)); snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-xiaohei"); uidev.id.bustype = BUS_USB; uidev.id.vendor = 0x1234; uidev.id.product = 0xfedc; uidev.id.version = 1; uidev.absmin[ABS_MT_POSITION_X] = 0; uidev.absmax[ABS_MT_POSITION_X] = 1920;//坐标x的最大 uidev.absfuzz[ABS_MT_POSITION_X] = 0; uidev.absflat[ABS_MT_POSITION_X] = 0; uidev.absmin[ABS_MT_POSITION_Y] = 0; uidev.absmax[ABS_MT_POSITION_Y] = 1080;//坐标y的最 uidev.absfuzz[ABS_MT_POSITION_Y] = 0; uidev.absflat[ABS_MT_POSITION_Y] = 0; uidev.absmin[ABS_MT_PRESSURE] = 0; uidev.absmax[ABS_MT_PRESSURE] = 100;//触摸压力的最大最小值 uidev.absfuzz[ABS_MT_PRESSURE] = 0; uidev.absflat[ABS_MT_PRESSURE] = 0; uidev.absmax[ABS_MT_SLOT] = 9; //同时支持最多9个触点 uidev.absmax[ABS_MT_TOUCH_MAJOR] = 16; //与屏接触面的最大值 uidev.absmax[ABS_MT_TRACKING_ID] = 65535; //按键码ID累计叠加最大值 ret = write(fd, &uidev, sizeof(struct uinput_user_dev)); ret = ioctl(fd, UI_DEV_CREATE); if (ret < 0) { close(fd); return ret; } while (1) { reportkey(fd,3,47,5); reportkey(fd,3,57,101); reportkey(fd,3,58,1000); reportkey(fd,1,330,1); reportkey(fd,3,53,600); reportkey(fd,3,54,600); reportkey(fd,0,0,0); reportkey(fd,3,47,5); reportkey(fd,3,53,900); reportkey(fd,3,54,900); reportkey(fd,0,0,0); reportkey(fd,3,47,5); reportkey(fd,3,57,101); reportkey(fd,3,58,0); reportkey(fd,3,57,4294967295); reportkey(fd,0,0,0); sleep(1); } ioctl(fd, UI_DEV_DESTROY); close(fd); return 0; }