現在のアプリケーションでキーボードが解釈されるのを防ぐ方法は?

現在のアプリケーションでキーボードが解釈されるのを防ぐ方法は?

Linuxには3つのUSBキーボードが接続されています。通常、どちらか一方に書き込むと、文字は端末や他のアプリケーションなど、現在アクティブなアプリケーションに「移動」します。

/dev/input/eventXただし、以下を使用して特定のデバイスを読み取って、両方のキーボードから直接キーボードイベントを読み込んでいます。Perlモジュール。スクリプトがすべてのイベントを正しく読み取り、デコードすると、入力したキーもアクティブアプリケーションに移動します。

問題は、キーボードイベントが特定のキーボードからアクティブアプリケーションにルーティングされるのを停止できることです。たとえば、特定のキーボードの入力を通常のキーボード入力として扱うべきではないことをカーネルに通知します。

デバイスノードを持つすべてのデバイスからデータを読み取るため、2つの可能な解決策があるX11ようです。/dev/input/event*

  1. USB "キーボード"の名前は、eventN例えば/dev/input/myinput0。残念ながらudev、ルールはデバイス名の変更を許可しません。 (このNAMEディレクティブはrules.dネットワークデバイスにのみ適用され、他のデバイスはシンボリックリンクのみを生成できます。)

  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

上記の作業を行う方法を知っていますか?

実際の背景:2つのUSB-RFIDリーダーが接続されています。たとえば、RFIDタグ付きのリーダーをタッチすると、キーボードに入力したのと同じRFID番号が送信され、リーダーは通常のキーボードのように機能します。

私のアプリケーションはバックグラウンドでRFIDイベントを読み取ることができ、(もちろん)RFIDの文字をアクティブウィンドウに入れたくありません。

答え1

とにかく読んでいる場合は、ioctlを/dev/input/eventX使用してくださいEVIOCGRAB。以下からioctlを発行できます。真珠簡単に。プログラムが終了したら、キャッチを解除することを忘れないでください。

インポートすると、他のすべてのデバイス(Xを含む)がこのデバイスからイベントを読み取ることができなくなります。

デバイスから直接読みたい他のアプリを除いて除外期間を制御することもできるため、これよりもクリーンですxinput(アプリの実行中)。

答え2

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

Udevが良い方法かもしれませんが、私がすぐに知っているのはX11です。

関連情報