【问题标题】:Use a mouse for non-mouse input使用鼠标进行非鼠标输入
【发布时间】:2009-08-14 08:54:05
【问题描述】:

所以我今天的问题与插入 linux 机器的 USB 鼠标接口有关。但是,我不希望鼠标对 X 环境产生任何传统影响——我只想能够通过原始输入利用嵌入其中的编码器。所以这是我的问题。

如何从 linux 中的 c++ 中的备用鼠标设备获取低级但有意义的数据?具体来说,我想知道沿 x 和 y 轴的相对位置或至少编码器计数。

【问题讨论】:

  • 您不希望“对 X 环境产生任何传统影响”,但您确实想要 x 轴和 y 轴?坐标不是只有在 X 环境中才有意义/可用性吗?
  • 我不知道?他们有吗?如果原始数据不是相对 x-y 差分,它是如何编码的?

标签: c++ linux mouse usb


【解决方案1】:

我为显示为 HID 键盘的 USB 条形码阅读器做了类似的事情。

在最近的内核中,/dev/input/event* 中会有一个鼠标事件设备。如果您打开它并使用 EVIOCGRAB ioctl() 抓取它,它不会将鼠标事件发送到任何其他应用程序。然后,您可以直接通过鼠标读取事件 - 请参阅 linux 源代码发行版中 Documentation/input/input.txt 中的 evdev 接口文档。

当你从事件设备中读取时,你会得到一个整数的输入事件,格式如下:

struct input_event {
    struct timeval time;
    unsigned short type;
    unsigned short code;
    unsigned int value;
};

(struct input_event及后面的宏都定义在linux/input.h中)。

您感兴趣的事件将有 input_event.type == EV_REL(相对运动事件),input_event.code 成员将类似于 REL_X(表示 X 轴 - 请参阅 linux/input.h 文件以获取完整列表) ,而input_event.value 将是位移。

正如另一个答案所暗示的那样,您无需自己实现 HID 协议。

【讨论】:

  • 这是否适用于需要独立跟踪的多个 USB 鼠标?
  • @Gerhman:是的,每只鼠标都有自己的/dev/input/event* 设备。
【解决方案2】:
猜你喜欢
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多