Fuchsia.ui.pointer

新增:7

协议

MouseSource

在 fuchsia.ui.pointer/mouse.fidl 中定义

客户端接收鼠标指针事件的方法。

指针事件的位置是在视图中视口的上下文中定义的。视图和视口的尺寸及其空间关系(使用转换矩阵定义)在 |ViewParameter| 表中同步提供。视图可以通过应用视口到视图转换矩阵,检索指针在其本地坐标系中的位置。

视口嵌入在独立且稳定的坐标系中,适合以与缩放无关的方式解读指针事件;即使在放大或平移等效果下,鼠标移动也会以恒定比例观察。不过,其他效果(例如扩大视图的剪辑边界)可能会触发视口范围的变化。

观看

客户端接收鼠标指针事件的方法。

此调用采用“挂起获取”模式:客户端请求一组近期事件,并通过回调接收这些事件。这种基于拉取的方法可确保客户端按照自己的节奏使用事件;事件不会以无限制的方式阻塞通道。

流控制。调用方一次最多只能有一个正在进行的 |Watch| 调用;并发调用 |Watch| 是逻辑错误。不合规会导致通道关闭。

客户端节奏。服务器将按照先进先出、无损、尽力而为的原则向调用方分派事件,但调用方必须分配足够的时间来跟上新事件。

事件时间。事件向量中每个事件的时间戳不保证单调;来自不同设备的事件可能会在不同时间注入 Scenic。通常,来自单个设备的事件应具有单调递增的时间戳。

查看参数。有时,视图或视口发生变化时需要通知客户端。如果 |MouseEvent| 包含 |ViewParameters|,则这些参数会应用于后续 |MousePointerSample|,直到下一个 |ViewParameters|。

请求

<EMPTY>

响应

名称类型
events vector<MouseEvent>:128

MouseSourceV2

在 fuchsia.ui.pointer/mouse.fidl 中定义

一种基于推送的读取器协议,供客户端接收鼠标指针事件。

连接后,直播会自动开始。Scenic 会在悬停 fragment 中分派鼠标事件,从 ENTERED 开始,到光标离开视图时的 EXITED 结束。

流控制和确认规则:

  • 在未收到客户端确认的情况下,服务器推送的事件数量不会超过 MOUSE_SOURCE_V2_MAX_UNACKNOWLEDGED_EVENTS(或产品配置的最大值)。当传输中的未确认事件达到此限制时,服务器 (Scenic) 将限制事件传送。
  • 客户端应定期发送确认(例如,在达到限制之前,例如在剩余 20 个配额内),以避免受到限制。
  • 无队头阻塞:由于通道和信用额度是每个视图独立的,因此无法确认 EXITED 事件的慢速客户端只会阻塞自己的通道。Scenic 可以立即开始通过自己的通道向新悬停的客户端推送事件。

指针事件的位置在视口(位于视图中,与 MouseSource 相同)的上下文中定义。

添加:33

AcknowledgeEvents

确认收到事件(最多 last_acknowledged_event_stamp 个)。

这会向服务器授予“积分”,以便发送更多事件。所有发送时 last_event_stamp 小于或等于 last_acknowledged_event_stamp 的事件都会被视为已确认。

当传输中未确认的事件达到 MOUSE_SOURCE_V2_MAX_UNACKNOWLEDGED_EVENTS(或产品配置的上限)时,服务器 (Scenic) 将限制事件传送。客户端应定期发送确认(例如,在达到上限之前,例如在剩余 20 个配额内),以避免受到限制。

last_acknowledged_event_stamp 必须严格递增。 不遵守规定会导致频道被关闭。

请求

名称类型
last_acknowledged_event_stamp uint64

OnMouseEvents

将鼠标指针事件从服务器推送到客户端。

连接后,直播会自动开始。在未收到确认的情况下,服务器推送的事件数不会超过 MOUSE_SOURCE_V2_MAX_UNACKNOWLEDGED_EVENTS(或产品配置的上限)。当传输中的未确认事件达到此限制时,服务器将限制事件传送。

响应

名称类型
events vector<MouseEvent>:128
last_event_stamp uint64

TouchSource

在 fuchsia.ui.pointer/touch.fidl 中定义

一种让客户端接收触摸事件并在全局手势消除歧义协议中做出响应的方法。

触摸事件的位置是在视图中视口的上下文中定义的。视图和视口的尺寸及其空间关系(使用转换矩阵定义)在 |ViewParameter| 表中同步提供。视图可以通过应用视口到视图转换矩阵,检索指针在其本地坐标系中的位置。

视口嵌入在独立且稳定的坐标系中,适合以与缩放无关的方式解读触摸事件;即使在放大或平移等效果下,系统也会以恒定比例观察到滑动。不过,其他效果(例如扩大视图的剪辑边界)可能会触发视口范围的变化。

UpdateResponse

手势协议允许客户端对触摸事件的开放互动执行“保留”操作;即使在互动关闭后,它也会阻止互动所有权的解析。此方法会更新客户端之前的“保留”状态,将其替换为允许继续进行所有权解析的响应。

如需了解如何将数据流结构化为互动,请参阅 |TouchInteractionId|。

流控制。每次互动最多允许调用方进行一次 |UpdateResponse| 调用,并且必须在已结束的互动中进行。如果可以通过 |Watch| 调用获得正常响应,则调用 |UpdateResponse| 是逻辑错误。

有效性。此 TouchResponse 不得是另一个“保持”响应,并且被覆盖的响应应为“保持”响应。

请求

名称类型
interaction TouchInteractionId
response TouchResponse

响应

<EMPTY>

观看

客户端接收触摸指针事件的方法。

此调用采用“挂起获取”模式:客户端请求一组近期事件,并通过回调接收这些事件。这种基于拉取的方法可确保客户端按照自己的节奏使用事件;事件不会以无限制的方式阻塞通道。

流控制。调用方一次最多只能有一个正在进行的 |Watch| 调用;并发调用 |Watch| 是逻辑错误。不合规会导致通道关闭。

客户端节奏。服务器将按照先进先出、无损、尽力而为的原则向调用方分派事件,但调用方必须分配足够的时间来跟上新事件。无响应的客户端可能会被归类为“应用无响应”,并被列为通道关闭的目标。

Responses。手势消除歧义方案依赖于服务器为每个 |TouchEvent|.|TouchPointerSample| 接收 |TouchResponse|;非样本事件应向服务器返回一个空的 |TouchResponse| 表。对 *先前* 事件的响应会在*下一次* 调用 |Watch| [1] 时提供给服务器。|responses| 向量中的每个元素都会被解读为对上一个 |events| 向量中事件的成对响应;向量长度必须匹配。请注意,客户端响应事件的协定在向 Scenic 注册其端点后立即开始,而不是在首次调用 Watch() 时开始。

初步回应。对 |Watch| 的首次调用必须是空向量。

事件时间。事件向量中每个事件的时间戳不保证单调;来自不同设备的触摸事件可能会在不同时间注入 Scenic。通常,来自单个设备的事件应具有单调递增的时间戳。

查看参数。有时,视图或视口发生变化时需要通知客户端。如果 |TouchEvent| 包含 |ViewParameters|,这些参数将应用于后续 |TouchPointerSample|,直到下一个 |ViewParameters|。

[1] 挂起获取模式可实现简单的 API 演变,但遗憾的是,它不允许将响应与事件进行惯用匹配。

请求

名称类型
responses vector<TouchResponse>:128

响应

名称类型
events vector<TouchEvent>:128

TouchSourceV2

在 fuchsia.ui.pointer/touch.fidl 中定义

一种基于推送的读取器协议,供客户端接收触摸事件。

不支持协作式手势消除歧义(始终使用模型)。 如果 Scenic 具有 V1 和 V2 客户端的组合,它们在视图树中竞争相同的触摸互动,则 Scenic 的手势竞技场会隐式地将 V2 客户端视为立即响应 YES(声明所有权)所有指针样本。然后,系统会根据标准优先级规则,针对其他 V1 客户端的显式响应(例如 YES、MAYBE 或 HOLD)来解析手势所有权。

需要协作手势消除歧义或增强功能(例如使用 LocalHit 的无障碍子系统)的客户端必须继续使用基于拉取的 TouchSource 协议。

流控制和确认规则:

  • 在未收到客户端确认的情况下,服务器推送的事件数量不会超过 TOUCH_SOURCE_V2_MAX_UNACKNOWLEDGED_EVENTS(或产品配置的最大值)。当传输中的未确认事件达到此限制时,服务器 (Scenic) 将限制事件传送。
  • 客户端应定期发送确认(例如,在达到限制之前,例如在剩余 20 个配额内),以避免受到限制。
  • 无队头阻塞:由于通道和信用额度是每个视图独立的,因此无法确认终端事件的慢速客户端只会阻塞自己的通道。Scenic 可以立即开始将事件推送到其自身通道上的其他视图。

与 TouchSource 类似,只有当触摸坐标成功与视图的某个活跃点击区域相交(通过 Scenic 的全局点击测试确定)时,Scenic 才会将触摸事件分派到 TouchSourceV2 通道。如果点击测试失败或定位到其他视图,则不会将任何触摸事件路由到此客户端的 TouchSourceV2 通道,从而保留 Fuchsia 界面系统的安全隔离边界。

触摸事件的位置在视口(位于视图中,与 TouchSource 相同)的上下文中定义。

添加:33

AcknowledgeEvents

确认收到事件(最多 last_acknowledged_event_stamp 个)。

这会向服务器授予“积分”,以便发送更多事件。所有发送时 last_event_stamp 小于或等于 last_acknowledged_event_stamp 的事件都会被视为已确认。

当传输中未确认的事件达到 TOUCH_SOURCE_V2_MAX_UNACKNOWLEDGED_EVENTS(或产品配置的上限)时,服务器 (Scenic) 将限制事件传送。客户端应定期发送确认(例如,在达到上限之前,例如在剩余 20 个配额内),以避免受到限制。

last_acknowledged_event_stamp 必须严格递增。 不遵守规定会导致频道被关闭。

请求

名称类型
last_acknowledged_event_stamp uint64

OnTouchEvents

将触摸事件从服务器推送到客户端。

连接后,直播会自动开始。在未收到确认的情况下,服务器推送的事件数不会超过 TOUCH_SOURCE_V2_MAX_UNACKNOWLEDGED_EVENTS(或产品配置的上限)。当传输中的未确认事件达到此限制时,服务器将限制事件传送。

响应

名称类型
events vector<TouchEvent>:128
last_event_stamp uint64

STRUCTS

MouseEventStreamInfo

在 fuchsia.ui.pointer/mouse.fidl 中定义

鼠标事件流的状态,从服务器发送到客户端。

不变:客户端的鼠标事件由 MouseViewStatus.ENTERED 和 MouseViewStatus.EXITED 括起来。

字段类型说明默认
device_id uint32

发出鼠标事件流的鼠标设备的标识符。

无默认应用
status MouseViewStatus

鼠标事件流的进入/退出状态,从服务器发送到客户端。

无默认应用

MouseSourceWatchResponse 资源

在 fuchsia.ui.pointer/mouse.fidl 中定义

添加:HEAD

字段类型说明默认
events vector<MouseEvent>:128 无默认应用

矩形

在 fuchsia.ui.pointer/view.fidl 中定义

轴对齐矩形。它由坐标系中的最小和最大范围定义。

字段类型说明默认
min Point2

此矩形的最小范围(含此值)。

  • 其坐标成对小于最大范围的坐标。
无默认应用
max Point2

此矩形的最大范围(含此值)。

  • 其坐标成对大于最小范围的坐标。
无默认应用

TouchInteractionId

在 fuchsia.ui.pointer/touch.fidl 中定义

事件流中触摸事件“互动”的唯一标识符。 触摸事件被视为一系列互动,因为手指会与显示屏接触和脱离。

遵循 EventPhase 状态机(从初始状态 ADD 开始)的有限指针事件序列称为互动。已关闭(或过去)的互动是指已达到终止状态(移除或取消)的互动;未关闭(或当前)的互动是指未达到终止状态的互动。

对于给定的设备指针,系统会将事件流视为一系列零个或多个已结束的互动(用户互动度的过往历史记录),后跟最多一个未结束的互动(当前用户互动度)。

由于我们需要按互动对指针事件进行分组,因此触摸事件会携带一个在该指针流中唯一的互动 ID。通过此通用引用,可以对已关闭的互动以及已打开的互动进行操作。

另请参阅 EventPhase,了解鼠标事件流。

字段类型说明默认
device_id uint32

发出触摸事件流的指控设备的标识符。一个设备可能拥有多个指针,每个指针都有自己的 |pointer_id|。

无默认应用
pointer_id uint32

发出此事件的指针的标识符。它仅对特定 |device_id| 唯一。每个 (device_id, pointer_id) 对一次最多发出一个开放互动。

无默认应用
interaction_id uint32

互动的标识符。它仅对特定的 (device_id, pointer_id) 对具有唯一性。

无默认应用

TouchInteractionResult

在 fuchsia.ui.pointer/touch.fidl 中定义

触摸事件互动的手势消除歧义结果,从服务器发送到客户端。

字段类型说明默认
interaction TouchInteractionId

此指针样本所属的互动。

无默认应用
status TouchInteractionStatus

互动的处置方式,从服务器发送到客户端。

无默认应用

TouchSourceWatchResponse 资源

在 fuchsia.ui.pointer/touch.fidl 中定义

添加:HEAD

字段类型说明默认
events vector<TouchEvent>:128 无默认应用

ViewParameters

在 fuchsia.ui.pointer/view.fidl 中定义

关联视图和视口的参数,足以正确解读分派到此视图的指针事件的位置和比例。

订购。这些参数通过与指针事件相同的通道到达,以便提供同步上下文,用于在视图的本地坐标系中解释指针事件的位置。

协议间冗余。其中一些参数也可能通过专用于视图控制的独立通道发送;客户端负责正确使用异步接收的参数。

TODO(https://fxbug.dev/42162292): Rename viewport, it is used in Flatland.

字段类型说明默认
view Rectangle

视图的内容区域,位于视图的坐标系中。

该矩形由父视图对此视图的剪裁设置定义。

无默认应用
viewport Rectangle

视口的互动区域,位于独立的坐标系中。

指针事件的位置在此视口的坐标系中定义。

视口范围的变化意味着指针互动区域本身已移动、大小已更改或两者兼而有之。

无默认应用
viewport_to_view_transform Mat3

将视口坐标系中的点位置与其在视图坐标系中的位置相关联的转换矩阵。

无默认应用

枚举

EventPhase 严格执行

类型:uint32

在 fuchsia.ui.pointer/state.fidl 中定义

指针事件的可能状态。流中的这些事件阶段遵循一个状态机,该状态机从 ADD 阶段开始,后跟零个或多个 CHANGE 阶段,最后以 REMOVE 或 CANCEL 阶段终止。

ADD ---> CHANGE* -+-> REMOVE
                  |
                  +-> CANCEL

从初始状态开始,遵循此状态机的有限指针事件序列称为“互动”。已关闭(或过去)的互动是指已达到终止状态的互动;未关闭(或当前)的互动是指未达到终止状态的互动。

对于给定的设备指针,系统会将事件流视为一系列零个或多个已结束的互动(用户互动度的过往历史记录),后跟最多一个未结束的互动(当前用户互动度)。

当我们需要按互动对指针事件进行分组时,事件会携带一个在该指针流中唯一的互动 ID。通过此通用引用,可以对已关闭的互动以及已打开的互动进行操作。

例如,触摸事件通常被视为一系列互动,因为手指会与显示屏接触和脱离。

名称值说明
1

设备已开始跟踪指针。

2

设备已报告指针状态更新。

3

设备已停止跟踪指针。

4

指针已不再可用。

MouseViewStatus strict

类型:uint32

在 fuchsia.ui.pointer/mouse.fidl 中定义

鼠标事件流与此视图的关系说明。

名称值说明
1

数据流会定向到此视图。

2

直播流已从该视图中移出。

TouchInteractionStatus strict

类型:uint32

在 fuchsia.ui.pointer/touch.fidl 中定义

互动与此客户的关系说明。

名称值说明
1

客户端已被拒绝拥有互动的所有权。

2

客户端已获得互动的所有权。

TouchResponseType strict

类型:uint32

在 fuchsia.ui.pointer/touch.fidl 中定义

客户端可以针对给定的 |TouchPointerSample| 做出响应的可能互动处置。用作手势消除歧义方案的一部分。

这些回答基于对互动的所有权主张。 客户端可以对开放式互动声明所有权,但服务器只会批准一个客户端的声明,其他客户端的声明会被拒绝。

名称值说明
1

客户端对此互动不再感兴趣;它会拒绝互动的所有权。客户端将停止接收此互动的事件。

2

客户端对此互动感兴趣,但需要查看更多事件才能做出决定;客户端尚未声明对此互动的所有权。

3

客户端对该互动感兴趣,但需要查看更多事件才能做出决定;客户端尚未声明对该互动的所有权。在所有权冲突解决过程中,它会优先于优先级较低的“可能”版权主张,但始终会输给“是”版权主张。

4

客户端对该互动感兴趣,但需要查看更多事件才能做出决定;客户端尚未声明对该互动的所有权。此外,它还会抑制优先级较低的声明,这些声明试图解决互动所有权问题。

5

客户端对该互动感兴趣,但需要查看更多事件才能做出决定;客户端尚未声明对该互动的所有权。此外,它还会抑制试图解决互动所有权问题的低优先级声明。在所有权解决过程中,它会优先于优先级较低的“可能”版权主张,但始终会输给“是”版权主张。

6

客户端对此互动感兴趣,但需要查看后续互动才能做出决定;客户端尚未声明对此互动的所有权。这可防止在互动结束时进行所有权解析。

7

客户端对此互动感兴趣,但需要查看后续互动才能做出决定;客户端尚未声明对此互动的所有权。这可防止在互动结束时进行所有权解析。此外,它还会抑制试图解决互动所有权问题的低优先级声明。

8

客户端希望独占访问此互动中的其余事件;它会声明对此互动的所有权(但该声明可能会被授予或拒绝)。在所有权冲突解决期间,它会将优先级让给优先级较低的“是”声明。

9

客户端希望独占访问此互动中的其余事件;它会声明对此互动的所有权(但该声明可能会被授予或拒绝)。在所有权冲突解决过程中,它会优先于优先级较低的“是”声明。

TABLES

MouseDeviceInfo

在 fuchsia.ui.pointer/mouse.fidl 中定义

有关发出鼠标事件流的设备的信息。

序数字段类型说明
id uint32

发出鼠标事件流的鼠标设备的标识符。 必填。

scroll_v_range fuchsia.input.report/Axis

设备发出的垂直滚动值范围。

scroll_h_range fuchsia.input.report/Axis

设备发出的水平滚动值范围。

buttons vector<uint8>:32

设备发出的按钮标识符(按优先级顺序)。

relative_motion_range RelativeMotionRange

设备发出的相对移动值的范围。

MouseEvent 资源

在 fuchsia.ui.pointer/mouse.fidl 中定义

添加:HEAD

序数字段类型说明
timestamp zx/Time

观察到此事件的时间。 必填。

view_parameters ViewParameters

关联视图和视口的参数,足以正确解读分派到视图的指针事件的位置、方向、幅度和事件间距离。

  • 它会在连接和更改时发出。
device_info MouseDeviceInfo

对鼠标设备的说明,足以正确解读设备的功能和使用意图。

  • 每台设备只会收到一次警告。
pointer_sample MousePointerSample

鼠标事件流中每个抽样数据点的说明。

颁发政策。有两种调度模式:“悬停”和“锁定”。 悬停模式是默认模式,系统会将数据流分段分发到每个鼠标事件悬停在其上方的可见客户端。锁定模式会将数据流定向到单个客户端(无论视图边界如何),直到解锁。锁定模式通常在用户按下鼠标主按钮时切换,但最终取决于产品专属政策。

stream_info MouseEventStreamInfo

悬停模式下进入/退出视图的信号。

  • 当悬停进入视图和悬停退出视图时,系统会发出此事件。
trace_flow_id uint64

一个标识符,用于关联此事件在组件边界或抽象层之间的发送/接收情况。

wake_lease handle<eventpair>

用于电源接力棒传递的可选唤醒租约。

MousePointerSample

在 fuchsia.ui.pointer/mouse.fidl 中定义

鼠标事件流中每个抽样数据点的说明。

MousePointerSample 可能会将多个状态更改捆绑到一个事件中。例如,如果用户滚动鼠标滚轮并同时按下左键,客户端可能会在 1 个事件中同时收到滚动和按钮状态更改,也可能会在单独的事件中收到按钮更改和滚动更改。

序数字段类型说明
device_id uint32

发出鼠标事件流的鼠标设备的标识符。 必填。

position_in_viewport Point2

此事件在视口坐标系中的位置。必填。

scroll_v int64

每个棘爪的相对垂直滚动位移。

scroll_h int64

每个棘爪的相对横向滚动位移。

pressed_buttons vector<uint8>:32

当前按下的按钮的标识符。

relative_motion RelativeMotion

执行的相对移动,与视口的坐标系无关。

scroll_v_physical_pixel float64

建议的垂直滚动位移(以物理像素为单位),通过加速器、定位器/毫米到像素的比率等计算得出。

scroll_h_physical_pixel float64

建议的水平滚动位移(以物理像素为单位),它是通过加速器、棘爪/毫米与像素的比率等计算得出的。

is_precision_scroll bool

指明滚动事件是否来自精确滚动设备(高分辨率鼠标或触控板)。客户端可能希望在非精确滚动设备上播放插值动画,以实现流畅滚动。

TouchDeviceInfo

在 fuchsia.ui.pointer/touch.fidl 中定义

有关发出触摸事件流的设备的信息。

序数字段类型说明
id uint32

发出触摸事件流的触摸设备的标识符。 一个设备可能拥有多个指针,每个指针都有自己的指针 ID 和自己的触摸事件流。 必填。

TouchEvent 资源

在 fuchsia.ui.pointer/touch.fidl 中定义

添加:HEAD

序数字段类型说明
timestamp zx/Time

观察到此事件的时间。 必填。

view_parameters ViewParameters

关联视图和视口的参数,足以正确解读分派到视图的触摸事件的位置、方向、幅度和事件间距离。

  • 它会在连接和更改时发出。
device_info TouchDeviceInfo

对指控设备的说明,足以正确解读设备的功能和使用意图。

  • 每台设备只会收到一次警告。
pointer_sample TouchPointerSample

对触摸事件互动中每个抽样数据点的说明。

  • 它针对互动中的每个样本发出。
interaction_result TouchInteractionResult

触摸事件互动的手势消除歧义结果。

  • 每次互动都会发出一次。
trace_flow_id uint64

一个标识符,用于关联此事件在组件边界或抽象层之间的发送/接收情况。

wake_lease handle<eventpair>

用于电源接力棒传递的可选唤醒租约。

TouchPointerSample

在 fuchsia.ui.pointer/touch.fidl 中定义

触摸事件流中每个抽样数据点的说明。所有字段均为必填字段。

序数字段类型说明
interaction TouchInteractionId

此指针样本所属的互动。

phase EventPhase

此事件在互动状态机中的状态。

position_in_viewport Point2

此事件在视口坐标系中的位置。

TouchResponse

在 fuchsia.ui.pointer/touch.fidl 中定义

每个 |Event| 的反馈事件,从客户端发送到服务器。

只有 |TouchPointerSample| 需要 |TouchResponseType|;对于其他事件,服务器需要一个空的 |TouchResponse| 表。

序数字段类型说明
response_type TouchResponseType

客户端针对给定 |TouchPointerSample| 响应的互动处置。

trace_flow_id uint64

用于在组件边界或抽象层之间关联此响应的发送/接收事件的标识符。

常量

名称值类型说明
MOUSE_MAX_EVENT 128 uint32
MOUSE_SOURCE_V2_MAX_UNACKNOWLEDGED_EVENTS 150 uint32

MouseSourceV2 允许传输中的未确认事件数量上限(默认值)。

对于典型的 240Hz 传感器采样率,这反映了大约 0.625 秒 (625ms) 的缓冲事件。

当传输中未确认的事件达到此限制时,服务器 (Scenic) 将限制事件传送。客户端应定期发送确认(例如,在达到限制之前,例如在剩余 20 个配额内),以避免被限制。

添加:33
TOUCH_MAX_EVENT 128 uint32
TOUCH_SOURCE_V2_MAX_UNACKNOWLEDGED_EVENTS 150 uint32

TouchSourceV2 允许传输中的未确认事件数量上限的默认值。

对于典型的 240Hz 触摸传感器采样率,这反映了大约 0.625 秒(625 毫秒)的缓冲事件。

当传输中未确认的事件达到此限制时,服务器 (Scenic) 将限制事件传送。客户端应定期发送确认(例如,在达到限制之前,例如在剩余 20 个配额内),以避免被限制。

添加:33

别名

名称值说明
Mat3 array[9]

浮点 3x3 矩阵。

  • 这些值按列主序放置。
Point2 array[2]

浮点二维点。

  • 这些值按 (x, y) 顺序排列。
RelativeMotion array[2]

鼠标设备执行的相对运动。

RelativeMotionRange array[2]
新增:32