我通过创建虚拟键盘/鼠标来玩uinput。 我没有问题来设置虚拟设备。
int fd;
struct uinput_user_dev uidev;
struct input_event ev;
int dx, dy;
int i;
fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if(fd < 0)
die("error: open");
if(ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0)
die("error: ioctl");
if(ioctl(fd, UI_SET_KEYBIT, BTN_LEFT) < 0)
die("error: ioctl");
if(ioctl(fd, UI_SET_EVBIT, EV_REL) < 0)
die("error: ioctl");
if(ioctl(fd, UI_SET_RELBIT, REL_X) < 0)
die("error: ioctl");
if(ioctl(fd, UI_SET_RELBIT, REL_Y) < 0)
die("error: ioctl");
memset(&uidev, 0, sizeof(uidev));
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "test");
uidev.id.bustype = BUS_USB;
uidev.id.vendor = 0x1;
uidev.id.product = 0x1;
uidev.id.version = 1;
write(fd, &uidev, sizeof(uidev))
ioctl(fd, UI_DEV_CREATE)
我可以在/ dev / uinput中编写事件。 它就像一个魅力,鼠标移动或键盘工作。
但是我不明白我在哪里可以阅读输入事件。 我可以在/ dev / input / mouse上阅读鼠标并查看虚拟鼠标的数据。但/ dev / input / mice适用于所有小鼠...
我应该在哪个/ dev / input / eventX中阅读? 我试图阅读所有这些内容但没有任何内容。
我为我的usb鼠标读取了event0,为键盘读取了event1 ...但是在哪里可以读到我的虚拟设备?
答案 0 :(得分:1)
通常,标准的udev规则用于根据名称生成符号链接;例如,在基于Debian的系统中,作为/dev/input/by-id/*-event-*
到相应的输入事件设备。因为它们基于设备属性,所以它们是稳定的:您只需使用符号链接来访问您的虚拟设备。
如果找不到符号链接,则可以搜索输入事件设备。
每个Linux输入事件设备都由伪目录/sys/class/input/event*
描述,即/sys/class/input/event0
,对应/dev/input/event0
或/dev/input/event/0
(以存在者为准)。
伪文件/sys/class/input/event*/device/name
包含设备名称。产品,供应商,版本和总线类型分别以伪文件/sys/class/input/event*/device/id/product
,/sys/class/input/event*/device/id/vendor
,/sys/class/input/event*/device/id/version
和/sys/class/input/event*/device/id/bustype
的四字符十六进制字符串形式提供。您可以正常阅读这些文件,但如果您stat()
或fstat()
,则其大小为零。相反,将这些文件的内容读取到一个小缓冲区(长度128,或最多126个字符+ "\n\0"
,应该足以满足名称; 8(4 + "\n\0"
)应该足以满足下面的文件id/
),并将其与所需的设备名称进行比较,或解析十六进制数字。