Мне нужно обнаружить устройство определенного типа (например, мышь) и перехватить его события в 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);
Подробное решение описано в эта тема.
Ядро libevdev относительно простое и не намного больше, чем read (), который читает в виде набора struct input_event. Они определены в linux / input.h, и вы можете получить тип, код и значение из них.
Большая часть того, что предоставляет libevdev, — это безопасность типов, поэтому вы не можете испортить ioctl и некоторые из крайних случаев обработки событий (большинство из них связано с мультитач).
Если ваша потребность довольно проста и понятна, написание кода напрямую будет работать так же хорошо, особенно если даже статическое связывание не подходит. Все, что вам нужно, это open (), read () и ioctl ().
Других решений пока нет …