查找键盘、鼠标的事件设备

Posted

技术标签:

【中文标题】查找键盘、鼠标的事件设备【英文标题】:Find event device for keyboard, mouse 【发布时间】:2012-04-04 04:18:54 【问题描述】:

找到硬件键盘鼠标事件设备节点万无一失方法是什么?

我尝试的是阅读 /proc/bus/input/devices 并在其中搜索 'Keyboard''Mouse'设备名称,但这并不总是有效,因为设备名称变化很大。

另一个选项是选择带有 Handlers=kbdHandlers=mouseX 的设备,但在笔记本电脑上,还有其他设备,例如“电源按钮”、“带有 Handlers=kbd 的视频总线。

【问题讨论】:

【参考方案1】:

所有输入设备在dev->class 字段中都有&input_class 值。因此,您可以遍历所有设备并检查(dev->class == &input_class)。接下来,对于您找到的每个输入设备,您需要查看它是否具有有效的键盘/鼠标设备名称(例如“mice”、“mouse%d”等)。

【讨论】:

设备名称变化很大,不一定包含鼠标、鼠标或键盘这三个词!【参考方案2】:

这是查找键盘事件的示例:

const std::string get_dev_event_kbd()

    std::string sline, sdev="/dev/input/", sH="", sBEV="";
    std::ifstream ifs("/proc/bus/input/devices");
    auto trimstr=[](std::string &s)
    
        int i=0, n=s.length(); //left
        while ((i<n)&&((s[i]==' ')||(s[i]=='\t'))) i++;
        s=(i>0)?s.substr(i):s;
        n=s.length()-1; i=n; //right
        while ((i>0)&&((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n')||(s[i]=='\r'))) i--;
        s=(i<n)?s.substr(0,i+1):s;
    ;

    while (std::getline(ifs,sline).good())
    
        if (sline[0]=='H')
        
            sH=sline.substr(sline.rfind(" event"));
            trimstr(sH);
        
        if (sline.substr(0,5)=="B: EV")
        
            sBEV=sline.substr(sline.find('=')+1);
            trimstr(sBEV);
        
        if (sBEV=="120013") break;
    
    sdev+=sH;
    return sdev;

有关详细信息,请参阅:this 和 this。 此外,如果您在设备上执行 open() 时收到错误 13(权限被拒绝)错误,请检查是否为其定义了组“输入”并将您的用户添加到组中

【讨论】:

以上是关于查找键盘、鼠标的事件设备的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中模拟适用于 Linux 和 Windows 的所有鼠标和键盘事件?

DOM 基础事件(鼠标、键盘)

Java JTable 添加了一个键盘事件,和鼠标点击事件的监听,如何在我键盘事件起作用时,让鼠标事件失效

正点原子I.MX6U-MINI应用篇7输入设备(鼠标键盘触摸屏按钮)的应用编程和tslib库

Mac 鼠标/键盘事件的监听和模拟

WPF之路-键盘与鼠标事件 - 简书