Linuxには3つのUSBキーボードが接続されています。通常、どちらか一方に書き込むと、文字は端末や他のアプリケーションなど、現在アクティブなアプリケーションに「移動」します。
/dev/input/eventX
ただし、以下を使用して特定のデバイスを読み取って、両方のキーボードから直接キーボードイベントを読み込んでいます。Perlモジュール。スクリプトがすべてのイベントを正しく読み取り、デコードすると、入力したキーもアクティブアプリケーションに移動します。
問題は、キーボードイベントが特定のキーボードからアクティブアプリケーションにルーティングされるのを停止できることです。たとえば、特定のキーボードの入力を通常のキーボード入力として扱うべきではないことをカーネルに通知します。
デバイスノードを持つすべてのデバイスからデータを読み取るため、2つの可能な解決策があるX11
ようです。/dev/input/event*
USB "キーボード"の名前は、
eventN
例えば/dev/input/myinput0
。残念ながらudev
、ルールはデバイス名の変更を許可しません。 (このNAME
ディレクティブはrules.d
ネットワークデバイスにのみ適用され、他のデバイスはシンボリックリンクのみを生成できます。)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です。