Виртуальная мышь и eventX
Я играю с 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 я должен прочитать? Я пытался прочитать их все, но ничего нет.
Я прочитал event0 для моей USB-мыши, event1 для клавиатуры... но где я могу прочитать о моем виртуальном устройстве?
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/
), и сравните его с нужным именем устройства или проанализируйте шестнадцатеричные числа.