Fuchsia.ui.input3

实体键盘事件

Fuchsia 的键盘服务提供了一种提供实体键盘的机制。 所有感兴趣的客户

渲染的文档

概览

关键事件只会传送到通过 Keyboard FIDL 订阅的组件 协议。对该服务感兴趣的组件,应在 组件清单,并在组件启动时对其进行注入。

典型用例:

  • 使用 Tab 键在表单字段之间导航。
  • 在菜单或列表中使用箭头键进行导航。
  • 按“f”可从菜单中打开文件
  • 正在关闭 ESC 上的弹出式窗口。
  • 游戏中的 WASD 导航。

传送媒体按钮、快捷方式和文本输入 (IME) 相关事件 通过专用接口单独访问。

关键事件只会传送给街景焦点链中的组件。 只有聚焦的组件会收到按键事件。

按键事件按从根到叶的顺序传递,即父组件优先。

父级组件能够通过 通过返回 KeyEventStatus.HandledKeyboardListener.OnKeyEvent,以防止 事件的传播。

客户端会通过 Pressed 收到按键被按下或释放的通知,并 Released 事件类型。

当客户端不可用时,系统会通知客户端按下或释放按键 (例如,未聚焦或未启动)通过 SyncCancel 事件类型实现。这些 只针对相关事件提供事件,例如同时按住多个键 客户端不可用。

示例

use fidl_fuchsia_ui_input3 as ui_input;

let keyboard = connect_to_protocol::<ui_input::KeyboardMarker>()
    .context("Failed to connect to Keyboard service")?;

let (listener_client_end, mut listener_stream) =
    create_request_stream::<ui_input::KeyboardListenerMarker>()?;

keyboard.add_listener(view_ref, listener_client_end).await.expect("add_listener");

match listener_stream.next().await {
    Some(Ok(ui_input::KeyboardListenerRequest::OnKeyEvent { event, responder, .. })) => {
        assert_eq!(event.key, Some(fuchsia_input::Key::A));
        responder.send(ui_input::Status::Handled).expect("response from key listener")
    },
}
添加时间:7

协议

KeyEventInjector

fuchsia.ui.input3/keyboard.fidl 中定义

提供将 KeyEvent 注入键盘子系统的功能。

角色

此协议通常为:

  • 由处理和提供键盘的平台组件实现 事件。
  • 由发起键盘事件的组件使用。例如: 屏幕键盘或会话框架输入管道。

相关协议

该协议应优先使用,而不是提供 功能类似具体而言,这意味着应首选此协议 超过

  • fuchsia.ui.input.ImeService,可提供 InjectInput()DispatchKey()、 和DispatchKey3()
  • fuchsia.ui.input.InputMethodEditor,它提供 InjectInput()DispatchKey3()

备注

产品应注意限制对此协议的访问,因为注入事件 与实体设备的数据无法区分。

注入

将事件注入键盘子系统。

返回

  • 如果键盘子系统将事件传递给使用方,则为 HANDLED; 且消费者报告它会HANDLED事件
  • NOT_HANDLED(如果键盘子系统未将事件传递至 任何消费者或没有消费者报告HANDLED该事件。

请求

名称类型
key_event KeyEvent

响应

名称类型
status KeyEventStatus

键盘

fuchsia.ui.input3/keyboard.fidl 中定义

组件可从其命名空间请求此服务,以便 实体按键事件

AddListener

为指定视图添加关键事件监听器。 如果添加了多个监听器,每个监听器都会单独接收按键事件, 应以 Status 响应。

调用 AddListener 的客户端应使与 Keyboard 的连接保持活跃状态 只要从 KeyboardListener 接收事件即可。将 到 Keyboard 协议的连接也会终止 KeyboardListener

请求

名称类型
view_ref fuchsia.ui.views/ViewRef
listener KeyboardListener

响应

<空>

KeyboardListener

fuchsia.ui.input3/keyboard.fidl 中定义

客户端应实现此协议以获取有关关键事件的通知。

OnKeyEvent

在发生按键事件(例如按键或释放)时调用。

协议实现者必须通过返回 Status 来做出响应来确认事件 及时处理,即不给整个流程造成严重延误。 输入流水线(通常为 10 秒)。

返回 NOT_HANDLED 意味着相应活动可能会提供给其他方 其他相关 API 的客户端。

未确认事件的客户端最终将断开连接。

通知仅会发送给具有焦点的视图。没有其他数据视图 (包括家长或孩子)将通过OnKeyEvent专门收到通知。

请求

名称类型
event KeyEvent

响应

名称类型
status KeyEventStatus

精英

KeyEventStatus 严格

类型:uint32

fuchsia.ui.input3/keyboard.fidl 中定义

客户端关键事件监听器的返回类型。

我们预计不会向此枚举添加新值。

名称说明
1

已处理关键事件,应停止其进一步传播。

2

按键事件未处理,应传递给其他客户端或监听器。

KeyEventType 严格

类型:uint32

fuchsia.ui.input3/events.fidl 中定义

键盘按键输入事件类型。

我们预计不会向此枚举添加新值。

名称说明
1

密钥已激活。

收到此类事件类型意味着密钥已激活 接收事件时的时间戳,而事件 焦点所在。

例如,如果按键是键盘按键, 已按下。

2

密钥已停止启动。

收到此类事件类型意味着键已失效 接收事件时的时间戳,而事件 焦点所在。

例如,如果按键是键盘按键, 发布。

3

客户端无法接收密钥时已激活密钥, 由于客户端能够接收 关键事件

可能的情况包括:

- A new device was connected while its key was actuated.
- The key was actuated while the event recipient did not
  have focus.

因此,这不是一个“常规”键的执行它会报告 因为密钥是在未知的过往启动的。部分 因此,活动接收者可能会认为这不是 一些可操作的关键事件,但也有一些用户可能将它判定为可操作关键事件。

例如,触发某些用户操作的收件人 决定忽略 SYNC 事件,以避免误操作。在 而跟踪键盘的收件人 州或省/自治区/直辖市可能会将 SYNC 事件视为信号, 将密钥的状态更新为已启动。

4

键可能已启动,但其已启动 因非键事件而失效 减激活。

可能的情况包括:

- A device was disconnected while its key was actuated.
- The event recipient just lost focus.

因此,这不是一个“常规”密钥停用。它会报告 该键由于除以下事件之外的其他事件而不再有效激活 发布密钥因此,某些活动接收者可能会决定 这不是可作为行动依据的关键事件,而另一些 决定。

例如,触发某些用户操作的收件人 决定忽略 CANCEL 事件,以避免误操作。在 而跟踪键盘的收件人 状态可能需要将 CANCEL 事件视为要更新的信号, 停用密钥的状态。

NonPrintableKey 柔性

类型:uint32

fuchsia.ui.input3/events.fidl 中定义

NonPrintableKey 表示键盘上非符号键的含义。

每个键的定义都派生自键的 W3C 命名值 属性

API 版本 9 及更高版本

从 API 版本 9 开始,根据 “已命名的关键属性值”部分的子部分编号,相乘 乘以 0x1000。

例如,3.10 多媒体键部分中的键将位于 0xa000-0xafff。存在的值和预留 未移动, 逻辑上按照现有部分的值已插入 按照前面的惯例(见下文)转化为逻辑位置。这样, 如果出于某种原因,我们可以提取区段范围, 应用。

API 版本 9 之前

不可打印键的空间大致分为 文档“已命名键属性值”第 3 节的子部分。 部分值是任意的,只要将 同时分配多个值,而保留具有类似用途的键 。

预留范围

[NonPrintableKey] 的可能值的空间细分为 范围的数量,目的是将枚举值放置在 适当的范围

  • 特殊键:0x00-0x10
  • 辅助键:0x11-0x30
  • 空白键:0x31-0x40
  • 导航键:0x61-0x80
  • 通用功能键:0x9000-0x9FFF

名称说明
0

当实现无法识别 其他键值对,由于硬件、平台或软件 限制条件。

添加时间:9
17

Alt(备用)键。

此键启用用于解释并发的备用辅助键函数 或后续的键盘输入。 此键值也用于 Apple Option 键。

添加时间:9
18

替代图形(AltGr 或 AltGraph)。

此键用于启用 ISO 级别 3 的 Shift 辅助键(标准的 Shift 键是级别 2 修饰符)。请参阅 ISO9995-1

添加时间:9
19

大写锁定(大写)键。

切换用于解释后续键盘输入事件的大写字符锁定功能。

添加时间:9
20

Ctrl 或 Ctrl 键,用于启用 Control 辅助键功能以解释并发或 后续键盘输入。

添加时间:9
21

功能开关 Fn 键。

如果同时启用此键和另一个键,系统会将该键的值更改为备用键 字符或函数。该按键通常直接在键盘硬件中处理, 通常不会产生关键事件。

添加时间:9
22

功能锁定(FnLock 或 F-Lock)键。

启用此键会切换键盘模式以更改某些按键值更改为 替代字符或函数。该按键通常直接在键盘硬件中处理 通常不会产生关键事件。

添加时间:9
23

Meta 键,用于启用元修饰符函数来解释并发或后续 键盘输入。

此键值用于 Windows 徽标键和 Apple Command 或 ⌘ 键。

添加时间:9
24

NumLock 或数字锁定键,可切换数字小键盘模式功能,以解读后续 键盘输入。

添加时间:9
25

滚动锁定键,用于在滚动模式和光标移动模式之间切换。

添加时间:9
26

Shift 键,可启用 Shift 辅助键函数以解释并发或后续 键盘输入。

添加时间:9
27

符号辅助键(用于某些虚拟键盘)。

添加时间:9
28

“符号锁定”键。

添加时间:9
29

Hyper 键。旧版修饰符。

添加时间:9
30

超级键。旧版修饰符。

添加时间:9
49

按 Enter 键或 ↵ 键可激活当前选择或接受当前输入内容。 该键值还用于 Return(Macintosh 数字键盘)键。

50

水平制表符 Tab 键。

65

删除紧接光标前的字符(即 字符)。

97

向下箭头导航键。

98

向左键导航键。

99

向右箭头导航键。

100

向上键导航键。

101

“End”键。

102

“家”键。

103

“Page Down”键。

104

“Page Up”键。

24581

EscapeEsc 键。

添加时间:10
24588

Select 键。用于选择要聚焦的任务窗口。

添加时间:10
28672

“调低亮度”键。通常控制显示屏亮度。

添加时间:10
28673

“调高亮度”键。通常控制显示屏亮度。

添加时间:10
36865

F1 键,即通用功能键,索引为 1。

添加时间:9
36866

F2 键,通用功能键,索引 2。

添加时间:9
36867

F3 键,即通用功能键,索引为 3。

添加时间:9
36868

F4 键,即通用功能键,索引为 4。

添加时间:9
36869

F5 键,一个通用功能键,索引为 5。

添加时间:9
36870

F6 键,一个通用功能键,索引为 6。

添加时间:9
36871

F7 键,即通用功能键,索引为 7。

添加时间:9
36872

F8 键,一个通用功能键,索引为 8。

添加时间:9
36873

F9 键,通用功能键,索引 9。

添加时间:9
36874

F10 键,即通用功能键,索引为 10。

添加时间:9
36875

F11 键,即通用功能键,索引为 11。

添加时间:9
36876

F1 键,即通用功能键,索引为 12。

添加时间:9
36881

通用虚拟功能键,索引为 1。

添加时间:9
36882

通用虚拟功能键,索引为 2。

添加时间:9
36883

通用虚拟功能键,索引为 3。

添加时间:9
36884

通用虚拟功能键,索引为 4。

添加时间:9
40968

暂停当前正在播放的媒体。

注意:媒体控制器设备应使用此值,而不是 PAUSE 用作暂停键。

添加时间:10
49162

调低音量。

添加时间:10
49163

调高音量。

添加时间:10
49164

在静音状态和之前的音量之间切换。

添加时间:10
61440

转到当前历史记录中的上一个内容或页面。

添加时间:10
61441

打开浏览器收藏夹列表。

添加时间:10
61442

转到当前历史记录中的下一个内容或页面。

添加时间:10
61443

前往用户的首选首页。

添加时间:10
61444

刷新当前网页或内容。

添加时间:10
61446
添加时间:10
73799

在全屏内容和缩放内容之间切换,或更改放大级别。

添加时间:10

表格

KeyEvent

fuchsia.ui.input3/events.fidl 中定义

生成的键盘事件,以反映按键输入。必须提供“timestamp”和“type”。 为有效事件,必须至少设置 keykey_meaning 中的一个。

Ordinal字段类型说明
timestamp zx/Time

记录事件的时间,以 CLOCK_MONOTONIC 时基为单位,以纳秒为单位。 每个关键事件都必须提供时间戳,用户可以预期 将始终存在。

type KeyEventType

事件类型。

key fuchsia.input/Key

识别忽略辅助键、布局、之前的按键事件等的按键。这称为 “实体键”。在关键事件并非源自的情况下 (例如屏幕键盘)时,此字段可能为空。

modifiers Modifiers

事件发生时有效的修饰符。 示例: CapsLock 处于关闭状态,用户先按 CapsLock,然后按 A,然后松开两者。 事件顺序如下:

  1. 类型:已按下,键:CapsLock;辅助键:无
  2. 类型:按下,键:A,辅助键:CapsLock
  3. 类型:已释放,键:CapsLock;辅助键:CapsLock
  4. 类型:已释放,键:A,辅助键:CapsLock

CapsLock 已开启,用户先按 CapsLock 键,再按 A 键,然后松开两者。

  1. 类型:按下,键:CapsLock;辅助键:CapsLock
  2. 类型:已按下,键:A,辅助键:无
  3. 类型:已释放,键:CapsLock;辅助键:无
  4. 类型:已释放,键:A,辅助键:无
key_meaning KeyMeaning

键的含义。

repeat_sequence uint32

KeyEvent 在自动重复序列中的序列号 键。

如果此事件是在对 输入文字。如果 KeyEvent 已生成 通过自动重复机制,系统会设置该属性, 每个连续生成的关键事件时递增 1。

lock_state LockState

事件发生时有效的锁定状态。

例如,如果 CapsLock 效果已打开(按“a”键 效果“A”),系统会设置锁定状态中的相应位。

注意:LockState 不同于 CapsLock 辅助键 。LockState.CAPS_LOCK即使将 大写锁定键目前未启动。

联合体

关键含义严格

fuchsia.ui.input3/events.fidl 中定义

按键的含义。这通常是插入 或表示与空格或 采用其他方式无法打印

Ordinal变体类型说明
codepoint uint32

表示所输入字符的 Unicode 代码点(如果有)。

  • 在 Dart 和 Go 中,这对应于 rune
  • 在 Rust 中,这对应于 char
  • 在 C 和 C++ 中,这对应于 ICU 的 UChar32。
non_printable_key NonPrintableKey

关键事件对应的键的含义(没有对应符号)。

LockState 柔性环境

类型:uint64

fuchsia.ui.input3/modifiers.fidl 中定义

当前处于活动状态的锁定状态的位字段。

锁定状态会报告具有锁定功能的钥匙的锁定功能是否处于启用状态 (需要按下一次即可启用,再按一次即可停用)。 设置位表示有效锁定状态。

例如,当 Caps Lock 键处于启用状态时,即按“a”键就能产生 的“A”CAPS_LOCK 位将处于活动状态。

LockState 中的位值被选择为与 Modifiers,但前提是这可以长期使用。

名称说明
1

CAPS_LOCK 修饰符被锁定时应用。

用户应注意,CAPS_LOCK 的影响仅限于 主要是字母键(甚至不是字母数字字符)。

例如,按美式 QWERTY 键盘上的 a,同时按 CAPS_LOCK 处于“已锁定”状态,则相应按键会表示 A,就像 Shift 辅助键一样 。不过,在 CAPS_LOCK 处于锁定状态时按 [ 会输出 [, 即使 Shift+[ 返回 {,也是如此。

字母按键的位置可能因 。

2

NUM_LOCK 修饰符被锁定时应用。

4

SCROLL_LOCK 修饰符被锁定时应用。

8

FUNCTION 修饰符被锁定时应用。

16

SYMBOL 修饰符被锁定时应用。

修饰符柔性环境

类型:uint64

fuchsia.ui.input3/modifiers.fidl 中定义

声明 Fuchsia 的输入子系统支持的所有修饰符。

修饰符是特殊键,用于修改用途或功能 与其他键组合使用时在“修饰符”类型中 如果特定的辅助键处于激活状态(按住),则也会设置位; 而不会影响修饰符是否具有关联的锁定状态。

注意:如果您想检查锁定状态(例如, Lock 需要将所有字母变成大写),您需要 [LockState] 。

有点特别,为了方便用户, “左”和“right”变种具有特殊的位值 。

名称说明
1

CAPS_LOCK 修饰符激活时应用。

2

NUM_LOCK 修饰符激活时应用。

4

SCROLL_LOCK 修饰符激活时应用。

8

FUNCTION 修饰符激活时应用。

16

SYMBOL 修饰符激活时应用。

32

在左 SHIFT 修饰符激活时应用。

64

在正确的 SHIFT 修饰符被激活时应用。

128

LEFT_SHIFTRIGHT_SHIFT 修饰符被激活时应用。

此位会掩盖为测试任一 LEFT_SHIFT 提供的便利 或 RIGHT_SHIFT

256

当左侧 ALT 修饰符激活时应用。

512

在正确的 ALT 修饰符被激活时应用。

1024

当左侧 ALT 或右侧 ALT 修饰符时应用 。

2048

ALT_GRAPH 修饰符激活时应用。

4096

LEFT_META 修饰符激活时应用。

8192

RIGHT_META 修饰符激活时应用。

16384

LEFT_METARIGHT_META 修饰符被激活时应用。

32768

LEFT_CTRL 修饰符激活时应用。

65536

RIGHT_CTRL 修饰符激活时应用。

131072

LEFT_CTRLRIGHT_CTRL 修饰符被激活时应用。