2009-08-14 122 views
3

因此,我今天遇到的问题与插入Linux机器的USB鼠标接口有关。但是,我不希望鼠标在X环境上产生任何传统效果 - 我只是希望能够通过原始输入利用嵌入其中的编码器。所以这是我的问题。使用鼠标进行非鼠标输入

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

+0

您不希望“对X环境有任何传统效果”,但您确实需要x和y轴? X坐标系中的坐标只有意义/可用性吗? – 2009-08-14 20:11:31

+0

我不知道?他们呢?如果原始数据不在相对的x-y差异中,它是如何编码的? – duckworthd 2009-08-15 02:27:34

回答

4

我做了一个USB条码阅读器呈现为HID键盘类似的东西。

在最近的内核中,/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协议。

+0

这是否适用于需要独立跟踪的多个USB鼠标? – Gerharddc 2014-01-25 08:20:23

+0

@ Gerhman:是的,每个鼠标都有自己的'/ dev/input/event *'设备。 – caf 2014-01-28 03:09:25