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

时间:2012-03-19 16:48:07

标签: linux linux-kernel device-driver linux-device-driver

什么是万无一失的方法,以便为硬件键盘鼠标找到事件设备节点?< / p>

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

另一个选择是选择 Handlers = kbd Handlers = mouseX 的那些,但在笔记本电脑上,还有其他设备,如“电源按钮”,视频总线'与处理程序= kbd

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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'并将您的用户添加到该组