来自文件 /dev/input 的鼠标输入

来自文件 /dev/input 的鼠标输入

我的目标是在 Linux 上获取鼠标输入。现在我正在尝试从 中的文件获取输入/dev/input。在我的特定系统上,我知道该文件/dev/input/event10对应于我的鼠标,并返回鼠标输入的 EV_REL 和 EV_KEY 事件。但是,我知道这并不通用,不同的/dev/input/event#文件对应不同的设备。我知道这个文件/dev/input/mice,但显然这个文件是“破解遗留系统”,所以我假设不鼓励使用它。我的问题的关键在于确定哪个输入事件文件对应于鼠标。我尝试搜索/proc/bus/input/devices其中给出与设备相对应的事件文件,但在设备名称中的“鼠标”一词之外,似乎没有表明它的用途。例如。鼠标、键盘。我所尝试的只是通过这些文件获取输入,但如果有一个替代系统可以获取输入,那么我会很高兴听到这一点。

答案1

这是一个迟到的回复,但以防万一将来有人偶然发现这一点,这里总结了如何在任何 Linux 系统上(通过算法)查找特定类型的设备。

Linux 不区分鼠标、键盘、游戏手柄等。理论上,输入设备可以发送任何类型的事件数据,并且不必“符合”特定类型的限制。然而,大多数现实世界的设备显然不是这样的。这就是为什么 sysfs 提供有关设备写入其 eventX 文件的数据类型的信息,这些信息称为设备的“功能”。以下是有关设备功能的信息摘要:

/sys/class/input/eventX/device/capabilities包含 9 个文本文件。absffkeyledmscrelsndsw对应于已记录的“事件类型”这里ev基本上描述了哪些其他文件包含非零数据。

每个文件包含 ASCII 十六进制字符,分为 16 个区域,并用空格分隔。需要读取十六进制字符并将其解码为二进制右到左。如果一个组包含的字符少于 16 个,则缺少的字符隐含为 0,需要手动附加到生成的二进制文件中。二进制数据中的每一位都是一个布尔标志,表明设备是否可以产生特定的事件代码

例子:设备 X 可以产生任何 KEY_ESC(退出键)事件吗?

  • 读取/sys/class/input/eventX/device/capabilities/key为 ASCII
  • 将字符解码为二进制(如上所述)
  • 检查从零开始的索引 KEY_ESC 处的位(根据输入事件代码.h, KEY_ESC = 1)
  • 如果该位为 1,则设备可能发送 KEY_ESC 事件(即,它可能是键盘,可以从候选鼠标中消除)。如果该位为0,那么它将绝不发送这些事件。

鼠标按钮也用 进行编码key,尽管它们的宏具有前缀BTN,因此方法基本相同。与您的情况相关的事实是,鼠标通常是唯一能够发送REL_<...>事件的设备。您可以在之前链接的 Linux 内核文档中找到更多相关信息。

是的,这是一项繁重的工作,但它是通用的,可以为您提供很多有关硬件及其功能的线索。

最后,我的 GitHub 上有更详细的文档如果有人感兴趣的话。

相关内容