Обработка событий устройства с помощью / dev / input / eventX и c / Stack Overflow

Мне нужно обнаружить устройство определенного типа (например, мышь) и перехватить его события в Linux с помощью демона.

Использование Xlib кажется бесполезным, потому что Xlib может только поймать событие с окном, созданным приложением, но не со всеми системными событиями (но если я ошибаюсь, пожалуйста, исправьте меня).

Одним из решений было использование /dev/input/eventX файлы (где X это номер). В командной строке ls -l by-id Я могу определить, какой файл событий обрабатывает определенное устройство.

Дальнейшее поиск в Google привело меня к libevdev. На самом деле это обертка вокруг системных вызовов (вам даже нужно вручную получить файловый дескриптор файла событий перед обработкой этого файла с помощью libevdev), но он также может выяснить типы и коды событий, которые это устройство может излучать до того, как эти события будут отправлены. Но я не могу использовать его, потому что есть некоторые трудности с встраиванием его в конечные компьютеры.

Итак, вопрос: могу ли я сделать это с C / C ++ без разбора ls -l by-id выход? Я имею в виду, могу ли я определить тип устройства, привязанного к определенному /dev/input/eventX файл или хотя бы получить типы событий, которые он может генерировать только с помощью системных вызовов?

А есть ли еще какие-нибудь решения для обнаружения событий устройства в linux?

Заранее спасибо.

=======

[UPD]: Еще одно решение в дополнение к тому, которое дал @AlejandroDiaz в комментариях к этому посту (кстати, не нашел, как вставить ссылку на определенный комментарий) без использования libevdev читает биты событий с помощью ioctl и анализирует их следующим образом:

int c_iHd = open("/dev/input/event0", O_RDONLY | O_NONBLOCK);
if(c_iHd == -1)
{
exit(1);
}
unsigned long c_uEventBits;
ioctl(c_iHd, EVIOCGBIT(0, EV_MAX), &c_uEventBits);
int hasButtonsEvent = (c_uEventBits >> EV_KEY) & 1;
close(c_iHd);

Подробное решение описано в эта тема.

1

Решение

Ядро libevdev относительно простое и не намного больше, чем read (), который читает в виде набора struct input_event. Они определены в linux / input.h, и вы можете получить тип, код и значение из них.

Большая часть того, что предоставляет libevdev, — это безопасность типов, поэтому вы не можете испортить ioctl и некоторые из крайних случаев обработки событий (большинство из них связано с мультитач).

Если ваша потребность довольно проста и понятна, написание кода напрямую будет работать так же хорошо, особенно если даже статическое связывание не подходит. Все, что вам нужно, это open (), read () и ioctl ().

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector