@
kuanat 感谢回复。又测试了手上的 MIUI 13 和 HyperOS ,发现两者对此有不同行为。我做了一些测试。
当按下 Alt 时 onKeyDown 中可以接收到 Alt 事件(如果长按了还会有一连串),但对于 HyperOS ,当按下后续字母时,会有那个字母按键的事件,但对于 MIUI 13 ,则是表现为那串 Alt 事件戛然而止,无后续的字母按键。
另外,才发现 HyperOS 其实同样是处理 compose key 的,以 Alt+S 为例,当系统接收到 Alt+S 时就会上屏`ß`,但尽管如此,不影响 IME 中获取到 Alt 后续的 S 事件,且只有在 IME 不拦截( onKeyDown 返回`false`)时才会上屏`ß`。反之,HyperOS 中无论 IME 是否拦截,则都会上屏`ß`。拦截无效,显然可以合理怀疑这是 MIUI 13 的 bug 。
在 MIUI 13 中是能找到“实体键盘布局”一选项,但当我选到了其他的布局时,compose key 倒没了(比如按 Alt+S 不会上屏`ß`了),但 IME 中仍然接收不到 Alt 修饰的按键。
那两个文件不需要 root 也可以由 adb 拉取,我看了下内容,左 ALT 的处理正常,如下:
```console
~/keyboard/miui13/keylayout ❯ rg -i 'KEY 56' 17:55:17
qwerty.kl
97:key 56 ALT_LEFT
Vendor_046d_Product_c532.kl
81:key 56 ALT_RIGHT
Vendor_22b8_Product_093d.kl
73:key 56 ALT_LEFT
Vendor_05ac_Product_0239.kl
78:key 56 ALT_LEFT
Vendor_18d1_Product_5018.kl
78:key 56 ALT_LEFT
Generic.kl
78:key 56 ALT_LEFT
```
对于“S”键的处理则都有在被 Alt 修饰时上屏`ß`(`\u00df`):
```console
~/keyboard/miui13/keychars ❯ rg -i 'KEY S ' --after-context=5 17:57:07
qwerty2.kcm
183:key S {
184- label: 'S'
185- number: '7'
186- base: 's'
187- shift, capslock: 'S'
188- alt: '\u00df'
qwerty.kcm
186:key S {
187- label: 'S'
188- number: '7'
189- base: 's'
190- shift, capslock: 'S'
191- alt: '4'
Generic.kcm
140:key S {
141- label: 'S'
142- base: 's'
143- shift, capslock: 'S'
144- alt: '\u00df'
145-}
Vendor_18d1_Product_5018.kcm
140:key S {
141- label: 'S'
142- base: 's'
143- shift, capslock: 'S'
144- alt: '\u00df'
145-}
Virtual.kcm
137:key S {
138- label: 'S'
139- base: 's'
140- shift, capslock: 'S'
141- alt: '\u00df'
142-}
```
MIUI 13 和 HyperOS 对于这些定义大差不差。没看出有什么大的不妥。顺便说下,MIUI 13 对于 Ctrl 在 IME 中也是获取不到后续按键的。似乎是 MIUI 13 直接一整个把至少这俩修饰键的处理全放在系统中拦截了(哪怕 Alt+某个 key 是完全没有 compose 行为的),就导致了 IME 看不到一点。