什么是万无一失的方法来查找硬件键盘或鼠标的事件设备节点
我尝试的是读取/proc/bus/input/设备,并在设备名称中搜索“键盘”或“鼠标”,但这并不总是有效的,因为设备名称差异很大。
另一种选择是选择带有Handlers=kbd和Handlers=mouseX的设备,但在笔记本电脑上,还有“电源按钮”、“视频总线”和Handlers=kbd等其他设备。
发布于 2012-03-20 18:54:27
所有输入设备的&input_class值都在dev->class字段中。因此,您可以遍历所有设备并检查是否为(dev->class == &input_class)。接下来,对于您找到的每个输入设备,您将需要查看它是否具有有效的键盘/鼠标设备名称(用于ex )。“老鼠”、“老鼠%d”等)。
发布于 2017-02-24 10:27:55
下面是查找键盘事件的示例:
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 (权限拒绝)错误,请检查是否为其定义了组“输入”,并将用户添加到组中。
https://stackoverflow.com/questions/9774260
复制相似问题