2012-03-19 119 views
5

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

我曾尝试是读的/ proc /巴士/输入/设备和搜索“键盘”“鼠标”在设备名称,但这并不总是工作,为设备名称差别很大。

另一种选择是用处理程序=大骨节病处理程序= mouseX来选择的,但在笔记本电脑上,也有像处理程序=大骨节病“电源按钮”,“电玩巴士”其他设备太。

回答

0

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

+0

设备名称有很大差异,不一定包含鼠标,鼠标或键盘的话! – vikraman 2012-03-22 18:57:05

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(权限被拒绝)错误,请检查是否为其定义了组“输入”并将您的用户添加到组中