2012-03-19 122 views
5

什麼是找到硬件鍵盤鼠標事件設備節點一個萬無一失方法?查找鍵盤事件設備,鼠標

我曾嘗試是讀的/ proc /巴士/輸入/設備和搜索「鍵盤」「鼠標」在設備名稱,但這並不總是工作,爲設備名稱差別很大。

另一種選擇是用處理程序=大骨節病處理程序= mouseX來選擇的,但在筆記本電腦上,也有像處理程序=大骨節病「電源按鈕」,「電玩巴士」其他設備太。

回答

0

所有輸入設備在dev->class字段中都有&input_class值。因此,您可以遍歷所有設備並檢查(dev->class == &input_class)。接下來,對於您發現的每個輸入設備,您需要查看它是否具有有效的鍵盤/鼠標設備名稱(例如「鼠標」,「鼠標%d」等)。

+0

設備名稱有很大差異,不一定包含鼠標,鼠標或鍵盤的話! – vikraman 2012-03-22 18:57:05

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

見:thisthis的更多細節。 此外,如果在設備上執行open()時出現錯誤13(權限被拒絕)錯誤,請檢查是否爲其定義了組「輸入」並將您的用戶添加到組中