3 个不稳定版本
0.2.0 | 2024年5月11日 |
---|---|
0.1.1 | 2023年3月2日 |
0.1.0 | 2022年10月2日 |
Unix API 排名第 793
每月下载量 35
80KB
1.5K SLoC
Rust 中的 HID Gadget 仿真
Rust 库,用于与 Linux HID Gadget 设备(/dev/hidgX)交互。该库支持 tokio 异步运行时。
由于所有功能都依赖于 Linux 函数调用,因此该库仅适用于 Linux 系统。
库
- hidg-core - 核心抽象和底层接口(不适用于最终用户)
- hidg - 仅支持同步操作的标准接口
- tokio-hidg - 为 tokio 运行时提供的异步接口
- async-hidg - 为其他运行时提供的异步接口
功能
- fromstr - 为某些类型实现 core::str::FromStr 实现
- display - 为某些类型实现 std::fmt::Display 实现
- phf - 在 core::str::FromStr 特性实现中使用 phf
- serde - 使某些类型支持 serde
- keyboard - 启用键盘类支持
- mouse - 启用鼠标类支持
使用示例
键盘输入仿真
use tokio_hidg::{Class, Device, Keyboard, Key, Led, StateChange};
#[tokio::main]
async fn main() -> std::io::Result<()> {
let mut device = Device::<Keyboard>::open(0).await?; // open device
// Create input report
let mut input = Keyboard.input();
// Press left ctrl modifier
input.press_key(Key::LeftCtrl);
// Press key 'A'
input.press_key(Key::A);
// Print pressed keys
println!("Keys: {:?}", input.pressed().collect::<Vec<Key>>());
// Send input report
device.input(&input).await?;
// Release left ctrl modifier
input.release_key(Key::LeftCtrl);
// Release key 'A'
input.release_key(Key::A);
// Send input report
device.input(&input).await?;
// Create output report
let mut output = Keyboard.output();
// Receive output report
device.output(&mut output).await?;
// Print lit LEDs
println!("LEDs: {:?}", output.lit().collect::<Vec<Led>>());
Ok(())
}
鼠标输入仿真
use tokio_hidg::{Button, Class, Device, Mouse, StateChange, ValueChange};
#[tokio::main]
async fn main() -> std::io::Result<()> {
let mut device = Device::<Mouse>::open("hidg0").await?; // open device
// Create input report
let mut input = Mouse.input();
// Press primary button
input.press_button(Button::Primary);
// Set pointer coordinates
input.change_pointer((150, 50), false);
// Send input report
device.input(&input).await?;
// Move pointer relatively
input.change_pointer((70, -30), true);
// Print pressed buttons
println!("Buttons: {:?}", input.pressed().collect::<Vec<Button>>());
// Release primary button
input.release_button(Button::Primary);
// Send input report
device.input(&input).await?;
Ok(())
}
依赖项
~3–11MB
~101K SLoC