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

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

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

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

【问题讨论】:

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


    【解决方案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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 2014-04-22
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多