【问题标题】:How do you read the mouse button state from /dev/input/mice?如何从 /dev/input/mice 读取鼠标按钮状态?
【发布时间】:2012-07-12 12:14:35
【问题描述】:

如何从 /dev/input/mice 读取鼠标按钮状态?我想检测按钮是否被按下。

【问题讨论】:

  • 你的代码的上下文是什么?有什么理由不能使用 XMouse?
  • 我使用的是 Qt Embedded 4.6。我想读取状态的原因是因为我不能依赖 Qt 的鼠标事件。小部件有时不会接收到鼠标释放事件。我不会使用标志和 qt 鼠标事件来跟踪按钮状态,而是尽可能从硬件读取状态。
  • 离题:对我来说听起来像是一个错误,如果你没有得到事件。能够信任 Qt 而不必采取变通方法不是更好吗?
  • 我会尝试不同的方法,然后让 Qt 处理它。
  • 即使我让 Qt 处理它似乎有时也无法接收到 MouseReleaseEvent。

标签: linux linux-device-driver


【解决方案1】:

您可以打开设备并从中读取。 /dev/input/mice 中的事件有 3 个字节长,需要进行一些解析。我认为现在首选的方法是使用 /dev/input/event# 代替。然而,这里是一个使用 /dev/input/mice 的小例子。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char** argv)
{
    int fd, bytes;
    unsigned char data[3];

    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;
    while(1)
    {
        // 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);
        }   
    }
    return 0; 
}

单击鼠标即可生成:

x=0, y=0, left=1, middle=0, right=0
x=0, y=0, left=0, middle=0, right=0

还有一个鼠标移动(注意“相对”鼠标移动坐标):

x=1, y=1, left=0, middle=0, right=0

【讨论】:

  • 感谢您的回答。如果您没有对该文件的写入权限(通常作为非管理员用户是这样),您可能会发现 open("/dev/input/mice", ...) 失败。您需要sudo 才能打开它。
  • 如何从数据中获取鼠标向上事件?
猜你喜欢
  • 2023-03-20
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多