什麼是找到硬件鍵盤或鼠標的事件設備節點一個萬無一失方法?查找鍵盤事件設備,鼠標
我曾嘗試是讀的/ proc /巴士/輸入/設備和搜索「鍵盤」或「鼠標」在設備名稱,但這並不總是工作,爲設備名稱差別很大。
另一種選擇是用處理程序=大骨節病和處理程序= mouseX來選擇的,但在筆記本電腦上,也有像處理程序=大骨節病「電源按鈕」,「電玩巴士」其他設備太。
什麼是找到硬件鍵盤或鼠標的事件設備節點一個萬無一失方法?查找鍵盤事件設備,鼠標
我曾嘗試是讀的/ 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