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

find硬件键盘鼠标事件设备节点是一种万无一失的方法?

我所尝试的是读取/ proc / bus / input / devices并在设备名称中search“键盘”“鼠标” ,但这并不总是起作用,因为设备名称有很大差异。

另一种方法是selectHandlers = kbdHandlers = mouseX ,但在笔记本电脑上,还有其他设备,如“电源button”,“video总线”, 处理程序= kbd

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

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

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

请参阅: 这和这个更多的细节。 此外,如果在设备上执行open()时出现错误13(Permission denied)错误,请检查是否为其定义了组“输入”,并将用户添加到组中