アプリからマウス/キーボードを制御するために使用する入力デバイス ドライバーを作成しました。これまでのところすべてが機能しており、アプリ内からキーボードとマウスの両方の入力イベントを生成できます。
私が今直面している問題は、キーボードにない特殊文字を入力できないことです。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文字を入力する解決策は何ですか?