/dev/input/mouse0 和 /dev/input/mice 之间的区别

/dev/input/mouse0 和 /dev/input/mice 之间的区别

我正在使用鼠标 USB 驱动程序,但我真的不知道如何区分和使用发送的/dev/input/mouse0信息/dev/input/mice

在谷歌上搜索几次后,我发现了关于使用的代码/dev/input/mice

int fd, bytes;
unsigned char data[4];

const char *pDevice = "/dev/input/mice";

// Open Mouse
fd = open(pDevice, O_RDWR);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pDevice);
    return -1;
}

int left, middle, right;
signed char x, y;

// Read Mouse
bytes = read(fd, data, sizeof(data));

if(bytes > 0)
{
    left = data[0] & 0x1;
    right = data[0] & 0x2;
    middle = data[0] & 0x4;

    x = data[1];
    y = data[2];
    printf("x=%d, y=%d, left=%d, middle=%d, right=%d\n", x, y, left, middle, right);

    if(left)
        return left;
    if(right)
        return right;
    if(middle)
        return middle;
}

return 0;

该程序运行但没有得到有关滚轮滚动的任何信息。

我找到了一个程序,它使用/dev/input/event0

int fd;
struct input_event ev
const char* pFile = "/dev/input/event0";

fd = open(pFile, O_RDONLY);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pFile);are
    return -1;
}

read(fd, &ev, sizeof(ev));
std::cout << "type : " << ev.type << "  code : " << ev.code << "  value : " << ev.value << std::endl;

close(fd);

return 0;

但是对角线移动存在问题,因为该文件同时只保存了1个坐标,并且X坐标优先于Y坐标,所以当你想在Y轴上移动鼠标时会很烦人。

我没有找到任何可用的代码/dev/input/mouse0,那么这个文件中保存了什么信息?

我的问题是:

  1. 保存了哪些信息/dev/input/mouse0
  2. 如何在不打开 2 个文件且不存在优先级问题(滚轮滚动 + X/Y 轴移动)的情况下读取所有鼠标信息?

答案1

Linux 输入子系统用户空间 API 文档回答您的问题。一般来说,所有文件/dev/input/均由事件处理器将设备事件分发到用户空间。

/dev/input/mouse0 和 /dev/input/mice 是什么?

来自介绍(重要部分我已标注)

1.3.1.3. 鼠标设备

mousedev 是一种让使用鼠标输入的旧程序正常工作的 hack。它接收来自鼠标或数字化器/平板电脑的事件,并向用户空间提供 PS/2 样式(类似 /dev/psaux)鼠标设备。

/dev/input 中的 Mousedev 设备(如上所示)是:

crw-r--r--   1 root     root      13,  32 Mar 28 22:45 mouse0
crw-r--r--   1 root     root      13,  33 Mar 29 00:41 mouse1
crw-r--r--   1 root     root      13,  34 Mar 29 00:41 mouse2
crw-r--r--   1 root     root      13,  35 Apr  1 10:50 mouse3 ... 
...
crw-r--r--   1 root     root      13,  62 Apr  1 10:50 mouse30
crw-r--r--   1 root     root      13,  63 Apr  1 10:50 mice

每个鼠标设备都分配给一个鼠标或数字化仪,除了最后一个 - mice。这个单一字符设备由所有鼠标和数字化仪共享,即使没有连接,设备也存在。这对于热插拔 USB 鼠标非常有用,这样即使没有鼠标,不处理热插拔的旧程序也可以打开设备。[...]

Mousedev 将生成 PS/2、ImPS/2(Microsoft IntelliMouse)或 ExplorerPS/2(IntelliMouse Explorer)协议,具体取决于读取数据的程序的需要。您可以将 GPM 和 X 设置为其中任何一个。如果您想使用 USB 鼠标上的滚轮,则需要 ImPS/2如果您想使用额外的(最多 5 个)按钮,则可以使用 ExplorerPS/2。

...这也可能是您看不到鼠标滚轮事件的原因。由于它是对旧版程序的“破解”,因此如果没有必要,您不应该使用它。

我怎样才能读取所有鼠标信息 [...]?

/dev/input/eventX使用提供的相应文件埃夫德夫(事件处理程序,不要与 xorg-driver evdev 混淆)。这显然是你的第二个代码片段所做的。

...但是优先级问题怎么办?

不存在优先权问题。根据2.2. 事件代码

SYN_报告:

用于同步并将事件分离为输入数据变化的包发生在同一时刻例如,鼠标运动可能会为一个运动设置 REL_X 和 REL_Y 值,然后发出 SYN_REPORT。下一个运动将发出更多 REL_X 和 REL_Y 值并发送另一个 SYN_REPORT。

因为直到某一事件发生的所有连续事件都SYN_REPORT可以被认为是同时发生的,所以它们的报告顺序并不重要。

例如(使用这个程序我在github上找到了):

time:1528290186.256449  type:EV_REL     code:REL_X      value:-1
time:1528290186.256449  type:EV_REL     code:REL_Y      value:1
time:1528290186.256449  type:EV_SYN     code:SYN_REPORT value:0
time:1528290186.264460  type:EV_REL     code:REL_Y      value:1
time:1528290186.264460  type:EV_REL     code:REL_WHEEL  value:-1
time:1528290186.264460  type:EV_SYN     code:SYN_REPORT value:0

可以看到,并发事件不仅由SYN_REPORT事件分隔,而且它们还具有相同的时间戳。

顺便说一句,您还可以使用它evtest来查看设备生成的事件。您可以找到它的源代码这里如果你对其工作原理感兴趣。

答案2

就我而言,尝试执行操作系统的鼠标事件。我的代码app.js是:

var Mouse = require("./node_modules/node-mouse/mouse");
 
var m = new Mouse();
 
m.on("mousedown",function(event) {
    console.log(event);
});
 
m.on("mouseup",function(event) {
    console.log(event);
});
 
// same as mouseup, but fired after
m.on("click",function(event) {
    console.log(event);
});
 
 
m.on("mousemove", function(event) {
    console.log(event);
});

我之前在跑步node app.js

所以它给了我以下错误

Error: EACCES: permission denied, open '/dev/input/mice'
Emitted 'error' event on Mouse instance at:

sudo 所以只需这样运行

node app.js

没有给出以下错误

{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 1,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}

相关内容