13

USBセカンドキーボード(実際にはバーコードスキャナー)から入力を取得するプログラムを作成しました。問題は、別のウィンドウがアクティブな場合、プログラムではなくそこにデータが入力されることです。誰かが私が間違っていることについてアドバイスをくれますか?

#include <stdio.h>
#include <string.h>

int main(int argc, char * argv[]){
   FILE * fp_in;
   char * data;
   fp_in = fopen("/dev/input/by-id/usb-04d9_1400-event-kbd","r");

   if(fp_in == NULL){
      fprintf(stderr,"Failed to open input by id\n");
   }

   fp_in = fopen("/dev/input/by-path/pci-0000:00:1d.1-usb-0:2:1.0-event-kbd","r");

   if(fp_in == NULL){
      fprintf(stderr,"Failed to open input by path\n");
      return 1;
   }

  while(1){
      fscanf(fp_in,data,"%s");
      fprintf(stderr,"%s",data);
  }
  return 0;
}

ありがとう


Confuzzled に代わって質問を言い換えるほど大胆な場合は、次のようにします。

Linux で入力デバイス (この場合はバーコード スキャナー) に接続するプログラムを作成して、入力がキーボード フォーカスを持つプログラムに送信されないようにするにはどうすればよいですか?

4

4 に答える 4

4

私は同じことをしようとしていました.私がしたことは、xinputを使用してそのデバイスを「フロート」することでした. 私の場合、xinput listショー(とりわけ)

HID Keyboard Device HID Keyboard Device id=13 [slave keyboard (3)]

バーコードスキャナーに対応したデバイスです。次に、単に入力できます

xinput float 13

端末に。スキャナーからのキーストロークは、フォーカスされたウィンドウに入力されなくなりますが、デバイス ファイルから読み取ることはできます。ただし、ファイルから読み取ったイベントをデコードして、必要な情報 (バーコード) を取得する必要があります。/dev/input/event* の形式を参照してください。これを行う方法については、

最後に、root 権限なしでデバイス ファイルを読み取るには、スキャナーの udev ルールを追加するだけです。私にとっては、次のようなものです。

SUBSYSTEM=="input", ATTRS{idVendor}=="1d57", ATTRS{idProduct}=="001c" MODE="0644"

スキャナーの idVendor と idProduct は、スキャナーを接続した後に の出力を調べることで見つけることができますdmesg

于 2014-02-17T01:49:04.483 に答える
2

この質問が出されてからしばらく経ちました :) とにかく、あなたがすべきことは、Linux 入力デバイス サブシステム API を使用することだと思います。

http://www.linuxjournal.com/article/6429ここに良い紹介があります。

于 2010-01-12T13:01:59.293 に答える
1

私があなたの質問を正しく理解していれば、あなたがやりたいことに対応するいくつかの問題があるかもしれません。

1)/ devフォルダー内のこれらのファイルから読み取るには、root権限が必要です。

2)(これについてはよくわかりませんが)しかし、これらは特別なファイルであるため、通常のファイルのように読み取ることはできないと思います。

これらの2つの問題を処理したとすると、XイベントはXサーバーによって処理されるため、問題は解決されません。Xサーバーは、同じファイルを同時に読み取ると考えることができます。これは、これらのイベントをキャプチャし、最上位のアクティブウィンドウ内の特定のイベントに関連するイベントハンドラー(存在する場合)を呼び出すことによって、それに応じて処理するものです。すべてのウィンドウは、何かが入力されたかどうかを通知するXサーバーと通信します。したがって、プログラムが実行されている状態でターミナルウィンドウを開いている場合でも、最初にXサーバーは、ターミナルで実行されているプログラムに渡されるキーの押下についてウィンドウに通知する必要があります。

同様の作業を行う別のコードは、ここにあります。

于 2011-10-23T16:14:06.697 に答える
1

あなたの仕事に関連する一般的な問題のリストから始めましょう。答えはわかりませんが、少なくとも問題が発生している理由を明らかにすることはできます。

  1. 明らかなセキュリティ上の理由から、キーボード デバイスにはアクセス制御の制限があります。明らかな理由から、任意のアプリケーションが適切な許可なしにキーボードをスニッフィング/フックできる場合、致命的な結果を招く可能性があります (別名: キーボード ロガー)。

  2. 場合によっては、1 つのアプリケーション (あなたの場合は X ) が入力デバイスの制御を取得すると、それに送信されるすべてのバイトが消費されます。したがって、許可の問題を回避できたとしても、他のソフトウェアがデータストリームを先に消費しているという問題がまだ残っています。

于 2008-11-12T23:58:20.910 に答える