0x4220 · LockKeyState
读取 Num Lock、Caps Lock 和 Scroll Lock 状态,或解码非请求锁定键报告。
LockKeyState 为具有 0x4220 功能的键盘上报已开启的锁定键。OpenLogi 读取此状态,并将后续广播用于锁定键提示。
**规格:**Logitech 没有公开此功能的规格。布局根据 Logi Options+ 2.8(静态分析)逆向得出。用于:锁定键提示。
函数参考
LockKeyStateFeature 可为功能版本 0 创建。
方法
| 函数 | HID++ fn | 签名 | 返回值 |
|---|---|---|---|
get_lock_state | 0 | () | LockKeys |
decode_broadcast | 事件解码器 | (&[u8; 16]) | LockKeys |
get_lock_state 是 async 方法,返回 Result<LockKeys, Hidpp20Error>。decode_broadcast 是不会失败的关联函数。
类型
LockKeys
LockKeys 是保留未知位的 u8 位字段。OpenLogi 保留未命名位,不会拒绝新键盘的未知状态。
| 字段 | 位 | 说明 |
|---|---|---|
NUM_LOCK | 1 << 0 | Num Lock 已开启。 |
CAPS_LOCK | 1 << 1 | Caps Lock 已开启。 |
SCROLL_LOCK | 1 << 2 | Scroll Lock 已开启。 |
事件
OpenLogi 不为此功能提供 listen() 方法。库存路径会先筛选软件 ID 0,再对这个功能索引的报告调用 decode_broadcast。
| 事件 | 载荷 | 说明 |
|---|---|---|
| 锁定键状态 | LockKeys | 完整的当前锁定键位掩码。 |
线格式
get_lock_state 使用 3 字节短请求载荷。OpenLogi 将响应规范化为 16 字节,再解码字节 0。
get_lock_state(fn 0)
请求:
| 字节 | 字段 | 说明 |
|---|---|---|
| 0–2 | — | 没有参数。OpenLogi 发送 0x00, 0x00, 0x00。 |
响应:
| 字节 | 字段 | 说明 |
|---|---|---|
| 0 | lock_keys | LockKeys 位掩码。 |
| 1–15 | — | OpenLogi 忽略这些字节。 |
锁定键广播
Logi Options+ 2.8 从此功能的任意非请求报告读取字节 0。OpenLogi 遵循此规则,不验证报告函数。
| 字节 | 字段 | 说明 |
|---|---|---|
| 0 | lock_keys | 与 get_lock_state 相同的 LockKeys 位掩码。Options+ 2.8 |
| 1–15 | — | OpenLogi 忽略这些字节。 |
OpenLogi 的用法
从 v0.8.15 起,OpenLogi 为每个在线连接读取一次锁定键状态。这个基线让 OpenLogi 能识别后续广播中变化的每个已命名位。
OpenLogi 为每个变化的已命名键排入一项提示更新。此类瞬时状态不会触发库存重新协调,也不会增加设置修订号。
代理会检查 lock_key_notifications。此设置默认是 true。OpenLogi 在 macOS、Linux 和 Windows 上显示 Caps Lock,在 Linux 和 Windows 上显示 Num Lock 与 Scroll Lock。
OpenLogi 不会写入 0x4220,也不会在退出时恢复状态。可查看屏幕提示了解可见行为。
Rust 用法
use hidpp::{
device::Device,
feature::lock_key_state::{LockKeyStateFeature, LockKeys},
};
// `device` is a discovered HID++ device.
device.enumerate_features().await?;
if let Some(feature) = device.get_feature::<LockKeyStateFeature>() {
let keys = feature.get_lock_state().await?;
if keys.contains(LockKeys::CAPS_LOCK) {
println!("Caps Lock is on");
}
}