| Crates.io | keyboard-codes |
| lib.rs | keyboard-codes |
| version | 0.3.0 |
| created_at | 2025-11-04 04:11:32.539646+00 |
| updated_at | 2025-11-05 13:12:08.67838+00 |
| description | Cross-platform keyboard key code mapping and conversion |
| homepage | |
| repository | https://github.com/ymc-github/keyboard-codes |
| max_upload_size | |
| id | 1915717 |
| size | 256,440 |
一个全面的跨平台 Rust 库,用于键盘键码映射和转换。支持 Windows、Linux 和 macOS,提供键名与平台特定编码之间的双向转换。
在 Cargo.toml 中添加:
[dependencies]
keyboard-codes = "0.2.0"
serde: 为所有键类型启用序列化/反序列化支持phf: 使用完美哈希函数加速字符串查找[dependencies]
keyboard-codes = { version = "0.2.0", features = ["serde", "phf"] }
use keyboard_codes::{Key, Modifier, Platform, KeyCodeMapper};
// 从字符串解析按键
let enter_key: Key = "Enter".parse().unwrap();
let shift_mod: Modifier = "Shift".parse().unwrap();
// 转换为平台特定编码
let windows_code = enter_key.to_code(Platform::Windows);
let linux_code = enter_key.to_code(Platform::Linux);
// 从编码解析
let key_from_code = Key::from_code(0x0D, Platform::Windows).unwrap();
// 获取当前平台
let current_platform = keyboard_codes::current_platform();
use keyboard_codes::{Key, Modifier, Platform, KeyCodeMapper};
// 字符串解析
assert_eq!("Escape".parse::<Key>().unwrap(), Key::Escape);
assert_eq!("Shift".parse::<Modifier>().unwrap(), Modifier::Shift);
// 编码转换
assert_eq!(Key::Enter.to_code(Platform::Windows), 0x0D);
assert_eq!(Key::Enter.to_code(Platform::Linux), 28);
assert_eq!(Key::Enter.to_code(Platform::MacOS), 36);
// 反向查找
assert_eq!(Key::from_code(0x1B, Platform::Windows), Some(Key::Escape));
assert_eq!(Modifier::from_code(42, Platform::Linux), Some(Modifier::LeftShift));
use keyboard_codes::{
parse_shortcut_with_aliases,
parse_shortcut_flexible,
parse_shortcut_sequence,
parse_input,
Shortcut
};
// 使用别名支持解析快捷键
let shortcut = parse_shortcut_with_aliases("ctrl+shift+a").unwrap();
assert_eq!(shortcut.modifiers, vec![Modifier::Control, Modifier::Shift]);
assert_eq!(shortcut.key, Key::A);
// 灵活分隔符支持 (+, -, 空格)
let shortcut = parse_shortcut_flexible("ctrl-shift a").unwrap();
// 解析快捷键序列
let shortcuts = parse_shortcut_sequence("ctrl+a, cmd+q, shift+enter").unwrap();
// 自动检测单键或快捷键
let single_key = parse_input("a").unwrap(); // 单键
let shortcut = parse_input("ctrl+a").unwrap(); // 快捷键
// 修饰键和键的别名支持
let shortcut = parse_shortcut_with_aliases("cmd+esc").unwrap(); // Meta+Escape
use keyboard_codes::{CustomKey, CustomKeyMap, Platform};
let mut custom_map = CustomKeyMap::new();
// 创建自定义宏键
let mut macro_key = CustomKey::new("MyMacro");
macro_key.add_platform_code(Platform::Windows, 0x100)
.add_platform_code(Platform::Linux, 200);
custom_map.add_key(macro_key).unwrap();
// 使用自定义键
if let Some(key) = custom_map.parse_by_name("MyMacro") {
let code = key.code(Platform::Windows).unwrap();
println!("自定义键编码: {}", code);
}
// 通过编码查找
if let Some(key) = custom_map.parse_by_code(200, Platform::Linux) {
println!("找到自定义键: {}", key.name());
}
use keyboard_codes::{current_platform, Key, KeyCodeMapper};
let platform = current_platform();
let key = Key::A;
let code = key.to_code(platform);
println!("按键 {} 在 {} 平台上的编码是 {}", key, platform, code);
库提供广泛的别名支持,方便解析:
ctrl, ctl → Controlshft → Shiftaltgr, opt, option → Altwin, windows, cmd, command, super → Metalctrl, lctl → LeftControlrshift, rshft → RightShiftesc → Escapereturn → Enterback, bs → Backspacedel → Deleteins → Insertpgup → PageUppgdn, pagedown → PageDownleft → ArrowLeftright → ArrowRightup → ArrowUpdown → ArrowDown0-9 → D0-D9| 平台 | 键码范围 | 说明 |
|---|---|---|
| Windows | 0x00 - 0xFF | 虚拟键码 |
| Linux | 0x00 - 0x2FF | 输入事件码 |
| macOS | 0x00 - 0x7F | 键码 |
库通过 KeyParseError 枚举提供全面的错误处理:
use keyboard_codes::KeyParseError;
match "UnknownKey".parse::<Key>() {
Ok(key) => println!("解析的按键: {}", key),
Err(KeyParseError::UnknownKey(name)) => println!("未知按键: {}", name),
Err(KeyParseError::UnknownModifier(modifier)) => println!("未知修饰键: {}", modifier),
Err(KeyParseError::InvalidShortcutFormat(msg)) => println!("无效的快捷键格式: {}", msg),
Err(e) => println!("其他错误: {}", e),
}
use keyboard_codes::{utils, Platform};
// 验证键码有效性
assert!(utils::is_valid_key_code(0x41, Platform::Windows));
assert!(!utils::is_valid_key_code(0x1000, Platform::Windows));
// 规范化键码
let normalized = utils::normalize_key_code(0x141, Platform::Windows); // 返回 0x41
// 验证键名有效性
assert!(utils::is_valid_key_name("Enter"));
assert!(!utils::is_valid_key_name("123"));
Key: 键盘按键枚举 (150+ 按键)Modifier: 修饰键枚举 (12 种变体)Platform: 平台类型枚举 (Windows、Linux、macOS)CustomKey: 自定义按键定义CustomKeyMap: 自定义按键映射管理器Shortcut: 解析后的键盘快捷键(包含修饰键)KeyCodeMapper: 键码映射特性,支持双向转换FromStr: 键和修饰键的字符串解析支持Display: 字符串表示支持mapping::standard: 标准键码映射mapping::custom: 自定义键映射功能parser: 带别名支持的高级输入解析types: 核心类型定义utils: 工具函数和辅助功能default: 无额外特性
serde: 为所有类型启用 Serialize 和 Deserialize 实现
phf: 使用完美哈希函数加速字符串到按键的解析
├── examples/
│ ├── basic_usage.rs # 基础用法示例
│ ├── game_input_system.rs # 游戏输入系统
│ ├── gui_shortcuts.rs # GUI 应用快捷键
│ ├── macro_system.rs # 自动化宏系统
│ ├── config_management.rs # 跨平台配置管理
│ ├── validation_tool.rs # 测试验证工具
│ └── advanced_parsing.rs # 高级解析功能
欢迎贡献!请随时提交 Pull Request、开启 Issue 或建议新功能。
本项目采用以下任一许可证:
按您的选择。
键码映射基于平台文档并跨多个来源交叉参考
受到 Rust 应用程序中需要一致的跨平台按键处理需求的启发