LinuxプログラムをCで作成していますが、特定のキーボードストロークをインターセプトする必要があります。
入力サブシステム(読み取り/書き込み/ dev / input / eventX)を使用して、キーボードストロークを受信する(「読み取り」機能を使用)か、キーボードストロークをシミュレートする(「書き込み」機能を使用)ことができます。
「読み取り」機能を使用すると、ユーザーのキーボードストロークをキャプチャできますが、このイベントは伝播され、その使用方法がわかりません。
デフォルトでは、入力イベントはリッスンしているすべてのアプリケーションとドライバーに送信されます。ただし、evdev
インターフェイスを介してアプリケーションにデバイスを取得させることは可能EVIOCGRAB
ioctl()
です。. それは、その特定のアプリケーションがその特定のデバイスからイベントを受け取ることだけを許可します。
このアプローチの問題は、特定のイベントが受信された後に伝播されるのを実際に防ぐことができないことです。事前にデバイスを取得することしかできず、すべてのイベントがキャプチャされます。したがって、入力イベントをフィルタリングする場合は、回避策を使用する必要があります。
私自身のevmapd
デーモンで使用した回避策には、元のデバイスを取得し、uinput
サブシステムを使用して、再マップされたキーやその他のさまざまな変更を含む、必要なすべての変更を別のデバイスに提供することが含まれていました...