AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1043832
Accepted
damadam
damadam
Asked: 2018-06-06 06:36:58 +0800 CST2018-06-06 06:36:58 +0800 CST 2018-06-06 06:36:58 +0800 CST

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

  • 772

我正在使用鼠标 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);
    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轴移动)?

mouse input-devices
  • 2 2 个回答
  • 13078 Views

2 个回答

  • Voted
  1. Best Answer
    danzel
    2018-06-07T05:17:51+08:002018-06-07T05:17:51+08:00

    Linux 输入子系统用户空间 API 文档回答了您的问题。通常,其中的所有文件/dev/input/都由将设备事件分发到用户空间的事件处理程序提供。

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

    来自介绍(我强调的重要部分)

    1.3.1.3。鼠标开发

    mousedev 是一种使使用鼠标输入的遗留程序工作的黑客。它从鼠标或数字化仪/平板电脑获取事件,并使 PS/2 样式(la /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
    

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

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

    ...这也可能是您看不到鼠标滚轮事件的原因。由于它是遗留程序的“黑客”,因此如果您不必使用它,则不应使用它。

    如何读取所有鼠标信息 [...]?

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

    ...但是优先级问题呢?

    没有优先级问题。根据2.2。事件代码:

    SYN_REPORT:

    用于将事件同步并分离为同时发生的输入数据变化包。例如,鼠标的运动可能会为一个运动设置 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来查看设备生成的事件。如果您对它的工作原理感兴趣,可以在这里找到它的源代码。

    • 7
  2. Krishna Jangid
    2021-03-06T06:06:39+08:002021-03-06T06:06:39+08:00

    就我而言,尝试执行操作系统的鼠标事件。我的代码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'
    }
    
    • 0

相关问题

  • 为什么我不能点击东西(软件相关问题)?[关闭]

  • Firefox 鼠标中键滚动

  • 如何为不同的鼠标设置不同的设置?

  • Ubuntu 和交互式媒体安装

  • 什么可能会阻止 xrandr 屏幕之间的鼠标移动?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve