我的目标是在 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 个文本文件。abs
、ff
、key
、led
、msc
、rel
、snd
和sw
对应于已记录的“事件类型”这里。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 上有更详细的文档如果有人感兴趣的话。