2012-03-19 11 views
5

ハードウェアキーボードまたはマウスためイベントデバイスノードを見つけるため確実な方法は何ですか?私が試してみました何キーボードのイベントのデバイスを検索し、マウス

はをは/ proc /バス/入力/デバイスを読み、「マウス」デバイス名でか「キーボード」を検索しているが、これはよう、常に動作しません。デバイス名は大きく異なります。

他の選択肢はハンドラ= KBDハンドラ=するmouseXでものを選択することでしたが、ラップトップ上で、ハンドラ= KBDと「電源ボタン」、「ビデオ・バス」のような他の装置がありますあまりにも。

答えて

0

すべての入力デバイスは&input_classの値をdev->classフィールドに持っています。したがって、すべてのデバイスを繰り返し処理し、(dev->class == &input_class)をチェックすることができます。次に、入力デバイスごとに有効なキーボード/マウスデバイス名(「マウス」、「マウス%d」など)があるかどうかを確認する必要があります。

+0

デバイス名は大きく異なります。必ずしもマウス、マウス、またはキーボードという言葉を含む必要はありません! – vikraman

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(Permission denied)エラーが発生した場合は、グループ 'input'が定義されていることを確認してグループに追加してください。