使用 /dev/input/eventX 和 c/c++ 处理设备事件

Device event handling with /dev/input/eventX and c/c++

我需要检测某种类型的设备(例如鼠标)并使用守护程序在 linux 中捕获它的事件。

使用Xlib似乎没有用,因为Xlib只能捕获应用程序创建的具有window的事件,而不是所有系统事件(但如果我错了,请纠正我) .

其中一个解决方案是使用 /dev/input/eventX 个文件(其中 X 是数字)。在带有 ls -l by-id 的命令行中,我可以检测到哪个事件文件处理某个设备。

进一步的谷歌搜索让我找到 libevdev。它实际上是系统调用的包装器(您甚至必须在使用 libevdev 处理此文件之前手动获取事件文件的文件描述符),但它也可以找出此设备发生的事件的 类型和代码 可以在发出这些事件之前发出。但是我不能使用它,因为将它嵌入到目标计算机上有一些困难。

所以问题是:我可以在不解析 ls -l by-id 输出的情况下使用 C/C++ 执行此操作吗?我的意思是我可以检测绑定到某些 /dev/input/eventX 文件的设备类型,或者至少获取它可以仅通过系统调用发出的事件类型吗?

如果在 linux else 中有任何检测设备事件的解决方案?

提前致谢。

=======

[UPD]: 除了@AlejandroDiaz 在对此 post 的评论中给出的解决方案之外的另一种解决方案(顺便说一句,没有找到如何粘贴参考某些评论)而不使用 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);

this thread 中描述了详细的解决方案。

libevdev的核心比较简单,无非就是一个read()读入一组structinput_event。这些在 linux/input.h 中定义,您可以从中获取类型、代码和值。

libevdev 提供的大部分内容都是类型安全的,因此您不能搞砸 ioctls 和一些事件处理的极端情况(其中大部分与多点触控有关)。

如果您的需求相当简单明了,直接编写代码也同样有效,尤其是在连静态链接都不是一个选项的情况下。然后你只需要 open()、read() 和 ioctl()。