虚拟鼠标和 eventX
Virtual mouse and eventX
我正在通过创建虚拟 keyboard/mouse 来玩 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/mice 鼠标上读取并查看虚拟鼠标的数据。但是 /dev/input/mice 适用于所有鼠标...
我应该阅读 /dev/input/eventX 中的哪一个?
我试图阅读所有这些但什么也没有。
我为我的 usb 鼠标读取了 event0,为键盘读取了 event1...但是我在哪里可以读取有关我的虚拟设备的信息?
通常使用标准的 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[=22=]"
,应该足以满足名称;8 (4 + "\n[=22=]"
) 应该足以满足下面的文件id/
), 并与需要的设备名称进行比较, 或者解析十六进制数.
我正在通过创建虚拟 keyboard/mouse 来玩 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/mice 鼠标上读取并查看虚拟鼠标的数据。但是 /dev/input/mice 适用于所有鼠标...
我应该阅读 /dev/input/eventX 中的哪一个? 我试图阅读所有这些但什么也没有。
我为我的 usb 鼠标读取了 event0,为键盘读取了 event1...但是我在哪里可以读取有关我的虚拟设备的信息?
通常使用标准的 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[=22=]"
,应该足以满足名称;8 (4 + "\n[=22=]"
) 应该足以满足下面的文件id/
), 并与需要的设备名称进行比较, 或者解析十六进制数.