查找键盘事件设备,鼠标
问题描述:
什么是找到硬件键盘或鼠标的事件设备节点一个万无一失方法?查找键盘事件设备,鼠标
我曾尝试是读的/ proc /巴士/输入/设备和搜索“键盘”或“鼠标”在设备名称,但这并不总是工作,为设备名称差别很大。
另一种选择是用处理程序=大骨节病和处理程序= mouseX来选择的,但在笔记本电脑上,也有像处理程序=大骨节病“电源按钮”,“电玩巴士”其他设备太。
答
所有输入设备在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;
}
见:this和this的更多细节。 此外,如果在设备上执行open()时出现错误13(权限被拒绝)错误,请检查是否为其定义了组“输入”并将您的用户添加到组中
设备名称有很大差异,不一定包含鼠标,鼠标或键盘的话! – vikraman 2012-03-22 18:57:05