異なるキーボードからの入力を区別する方法は?


14

デフォルトのキーボードとアプリケーション用に特別に設計されたキーボードで使用できるアプリケーションをPythonで作成したいと思います。ステッカー付きの小さな数字キーボードを使用して、さまざまなキーにアクションを与えることで、単純に設計します。両方のキーボードはUSBで接続されます。

ただし、これらのキーが押されると、通常の信号(数字、演算子、および入力)のみがPythonに送信され、メインキーボードと特殊キーボードからの信号を区別できなくなります。

Pythonには(私が知る限り)この区別をする方法がないため、OS自体で行いたいと思います。Raspberry Pi用にプログラミングするので、Linuxになります。

したがって、主な質問:特定のキーボードのキーを他のキーコードに再マップするにはどうすればよいですか。他の目的には使用しないFキーを使用することを考えました。または、キーボード上に存在しない一部の文字(そのような文字がある場合)。

これはLinux / Unixで可能ですか?もしそうなら、どうすればいいですか?


キーボードはどのように取り付けられますか?デバイスから直接読みたい場合があります。それは私にとって最も明白な方法ですが、もっと良い方法があると思います。
TNW

USBで接続することを追加しました。Pythonを使用してデバイスから直接読み取るにはどうすればよいですか?
スティーブンルーズ

受け入れられていない答えは受け入れられている答えよりもはるかに単純であるように見えます。
ニカナレクラビクス

回答:


12

Linuxを使用している場合、入力デバイスを区別する最良の方法は、Linuxイベントインターフェイスを使用することです。デバイスのハードウェア固有の入力がデコードされた後、中間のLinux固有のイベント構造に変換され、で1つ以上のキャラクターデバイスを読み取ることで利用可能になります/dev/input/。ちなみに、これは使用するプログラミング言語から完全に独立しています。

各ハードウェアデバイスは独自のデバイスを取得し、/dev/input/eventX集合体もあります(たとえば/dev/input/mice、システム内のすべてのマウスの動きを表します)。お使いのシステムにはとも/dev/input/by-pathあり/dev/input/by-idます。

あります ioctlと呼ばれるEVIOCGNAME人間が読める文字列として、デバイスの名前を返すか、のようなものを使用することができます/dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse

デバイスを開くと、入力ハードウェアからイベントが到着するたびに、データのパケットが取得されます。Cを読むことができれば、ファイルを調べることができます/usr/include/linux/input.hこの内容がどのように機能するかを正確に示すを。そうでない場合は、必要なすべての情報を提供するこの質問読むことができます

イベントインターフェイスの良い点は、必要なデバイスを見つけるだけで、その入力デバイスから入力を読み取れることです。 だけで、他のすべてを無視して、のみ。また、端末から「調理済み」の文字ストリームを読み取るだけでは通常はできないキー、ボタン、およびコントロールに関する通知も受け取りますShift

悪い点は、イベントインターフェイスが「調理済み」文字を返さず、キーに数値コードのみを使用することです(各キーに対応するコードは、前述のヘッダーファイルにありますが、Pythonソースのevent.pyにもあります。入力デバイスに通常とは異なるキー/ボタンがある場合は、正しい数字が得られるまで少し実験する必要があります。


2

別の方法(「キーボード」に多くのキーがない場合-多くのデバイスがキーボードのふりをする場合)は、各キーボードにキーマッピングを適用し、キーを区別することです。

/superuser/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-onlyで概要を説明しています。主なポイントはsetxkbmapはデバイス引数を取ります。

raw入力アプローチを使用している場合、lsinputはrawデバイスを見つけます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.