web-dev-qa-db-ja.com

異なるキーボードからの入力を区別するにはどうすればよいですか?

Pythonでアプリケーションを作成したいと思います。アプリケーション用に特別に設計されたものです。ステッカー付きの小さな数字キーボードを使用してアクションを実行するだけで設計します両方のキーボードはUSBで接続されます。

ただし、これらのキーを押すと、通常の信号(数字、演算子、Enter)だけがPythonに送信され、メインキーボードからの信号と特別なキーボード。

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

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

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

14
Steven Roose

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

各ハードウェアデバイスは独自の/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ファイルを調べて、これがどのように機能するかを正確に示すことができます。そうでない場合は、必要なすべての情報を提供するこの質問を 読むことができます

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

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

13
Alexios

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

これの概要は次のとおりです: https://superuser.com/questions/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-onlysetxkbmapである主要なポイントは、デバイス引数を取ります。

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

2
Att Righ