4

アプリからマウス/キーボードを制御するために使用する入力デバイス ドライバーを作成しました。これまでのところすべてが機能しており、アプリ内からキーボードとマウスの両方の入力イベントを生成できます。

私が今直面している問題は、キーボードにない特殊文字を入力できないことです。eszett (ß) を入力したい場合、入力デバイスのキープレスをシミュレートすることはできません。

私が間違っていなければ、キー キャラクター マップ ファイルでこの問題を解決できるはずです。ユニコード文字を特定のキーにマップし、そのキーのキープレスをシミュレートすると、文字が入力されます。

これを試しましたが、うまくいかず、なぜうまくいかないのかわかりません。Virtual.kcm ファイルをコピーし、デバイスのベンダーと製品 ID を表す名前に変更しました。テストするために、0 キーが押されたときに「0」の代わりに eszett を入力するように、ファイル内の 1 行を置き換えました。

key 0 {
    label:         '\u00df'  // instead of '0'
    base:          '\u00df'  // instead of '0'
    shift:         ')'
}

「dumpsys input」の出力をチェックして、入力デバイスが正しい kcm ファイルを使用していることを確認しました。

6: custom-input
  Classes: 0x8000006b
  Path: /dev/input/event5
  Descriptor: ab3fb155bce23398b91099a8f37d5cae61f29d21
  Location: 
  UniqueId: 
  Identifier: bus=0x0003, vendor=0x1111, product=0x2222, version=0x0001
  KeyLayoutFile: /system/usr/keylayout/Vendor_1111_Product_2222.kl
  KeyCharacterMapFile: /system/usr/keychars/Vendor_1111_Product_2222.kcm
  ConfigurationFile: 
  HaveKeyboardLayoutOverlay: true

これまでのところすべて問題ないように見えますが、実際に sendevent を使用して入力イベントを生成すると、eszett ではなく「0」が入力されます。

sendevent /dev/input/event5 1 11 1  (KEY_EV, KEY_0, DOWN)
sendevent /dev/input/event5 0 0 0   (SYNC)
sendevent /dev/input/event5 1 11 0  (KEY_EV, KEY_0, UP)
sendevent /dev/input/event5 0 0 0   (SYNC)

私は本当にこれが機能することを期待していましたが、どうやらそうではありません。足りないものはありますか?

kcmファイルを使用して(または別の方法で)入力デバイスを介してUnicode文字を入力する解決策は何ですか?

4

2 に答える 2