我正在使用鼠标 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
,那么这个文件中保存了什么信息?
我的问题是:
- 保存了哪些信息
/dev/input/mouse0
? - 如何在不打开 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'
}