虚拟鼠标和eventX

时间:2015-10-22 07:28:45

标签: c linux input kernel subsystem

我通过创建虚拟键盘/鼠标来玩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 ...但是在哪里可以读到我的虚拟设备?

1 个答案:

答案 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/),并将其与所需的设备名称进行比较,或解析十六进制数字。