web-dev-qa-db-ja.com

キーボードが現在のアプリケーションによって解釈されないようにするにはどうすればよいですか?

Linuxに3つのUSBキーボードが接続されています。通常、いずれか1つに書き込む場合、文字は現在アクティブなアプリケーションに「移動」します。ターミナルまたは他のアプリに。

しかし、私はいくつかの Perlモジュール を使用して特定の/dev/input/eventXデバイスを読み取ることにより、2つのキーボードからキーボードイベントを直接読み取っています。スクリプトがすべてのイベントを正しく読み取ってデコードしている間、入力されたキーもアクティブなアプリケーションに入ります。

質問は次のとおりです:特定のキーボードからアクティブなアプリケーションへのキーボードイベントのルーティングを停止することは可能ですか?例:特定のキーボードからの入力を通常のキーボード入力と見なすべきではないことをカーネルにいくらか伝えます。

[〜#〜]編集[〜#〜]

X11は、/dev/input/event*にデバイスノードがあるすべてのデバイスから読み取るため、次の2つの解決策が考えられます。

  1. USB「キーボード」の名前をeventNではなく別の名前に変更します(例:/dev/input/myinput0)。残念ながら、udevルールではデバイスの名前を変更できません。 (rules.dNAMEディレクティブは、ネットワークデバイスに対してのみ機能します。他のデバイスは、シンボリックリンクのみを作成できます)
  2. X11/usr/share/X11/xorg.conf.d/10-evdev.conf構成を多少変更して、特定の「キーボードのような」デバイスを無視します。すべてのeventNデバイスを読み取らないでください。現在私のシステムには次のものが含まれています。
Section "InputClass"
        Identifier "evdev keyboard catchall"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection

ANY IDEA上記のいずれかを行う方法は?


本当の背景:2つのUSB-RFIDリーダーを接続しました。それらはキーボードとして機能します。 RFIDタグでリーダーに触れると、キーボードで入力したとおりにRFID番号が送信されます。たとえば、リーダーは通常のキーボードとして機能します。私のアプリケーションは(バックグラウンドで)RFIDイベントを読み取ることができ、(もちろん)RFIDからアクティブウィンドウに文字を取得したくありません。

4
jm666

とにかく/dev/input/eventXから読んでいる場合は、EVIOCGRABioctlを実行してください。 Perl でioctlを簡単に発行できます。プログラムが終了したら、グラブを解放することを忘れないでください。

グラブは、Xを含む他のすべてのデバイスがこのデバイスからイベントを読み取るのを防ぎます。

これはxinputよりもクリーンです。これは、デバイスから直接読み取りたい可能性のある他のアプリケーションも除外し、除外の期間を制御できるためです(アプリケーションが実行されている限り)。

2
dirkt

xinputコマンドを使用して、Xの下の入力デバイスを無効にすることができます。実行xinput list使用可能なデバイスを一覧表示してから、xinput disable …名前または番号でデバイスを無効にします。

Udevはおそらく進むべき道ですが、X11は私が頭の中で知っている方法です。