什么是万无一失的方法,以便为硬件键盘或鼠标找到事件设备节点?< / p>
我试过的是阅读 / proc / bus / input / devices 并搜索'Keyboard'或'Mouse' in设备名称,但这并不总是有效,因为设备名称变化很大。
另一个选择是选择 Handlers = kbd 和 Handlers = mouseX 的那些,但在笔记本电脑上,还有其他设备,如“电源按钮”,视频总线'与处理程序= kbd 。
答案 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;
}
有关详细信息,请参阅:this和this。 此外,如果在设备上执行open()时收到错误13(权限被拒绝)错误,请检查是否为其定义了组'input'并将您的用户添加到该组