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

6
什么是一种寻找硬件键盘或鼠标的事件设备节点的绝对可靠方法?
我尝试过读取 /proc/bus/input/devices 并在设备名称中搜索“键盘”或“鼠标”,但这种方法并不总是有效,因为设备名称有很大差异。
另一个选择是选择那些具有 Handlers=kbd 和 Handlers=mouseX 的设备,但在笔记本电脑上,还有其他如“电源按钮”、“视频总线”等带有 Handlers=kbd 的设备。
2个回答

0

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


设备名称变化很大,并不一定包含单词"鼠标"、"键盘"! - vikraman

0

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

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;
}

请参考thisthis以获取更多详细信息。 此外,如果在设备上执行open()时出现错误13(权限被拒绝)错误,请检查是否为其定义了“input”组,并将您的用户添加到该组中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接