我创建了一个输入设备驱动程序,用于从应用程序控制鼠标/键盘。到目前为止一切正常,我可以从应用程序中为键盘和鼠标生成输入事件。
我现在面临的问题是我无法输入键盘上没有的特殊字符。如果我想输入一个 eszett (ß),我不能只为我的输入设备模拟按键。
如果我没记错的话,关键字符映射文件应该能够解决这个问题。我可以将 unicode 字符映射到某些键,然后模拟该键的按键,然后输入该字符。
我试过这个,但它不起作用,我不明白为什么它不起作用。我复制了 Virtual.kcm 文件并将其重命名为代表我的设备供应商和产品 ID。为了测试,当按下 0 键时,我替换了文件中的一行以输入 eszett 而不是“0”:
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 生成输入事件时,它仍然输入“0”而不是 eszett。
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 字符的解决方案是什么?