4个版本
0.2.1 | 2023年9月26日 |
---|---|
0.2.0 | 2023年3月31日 |
0.1.1 | 2022年9月28日 |
0.1.0 | 2022年9月28日 |
#53 在 Windows API
每月下载量 35
58KB
1K SLoC
Windows Hotkeys
一个轻量级的crate,用于处理Windows上的全局热键
windows-hotkeys
crate对winapi的所有交互进行抽象和处理,包括注册热键、处理事件并提供线程安全的访问。使用热键管理器实例注册键组合以及易于使用的回调。
特性
- 可在多个线程中使用,绕过WinAPI对热键API同一线程的要求
- 对winapi函数和事件的完整高级抽象
- 易于使用
- 使用键 + 修饰符注册热键
- 使用键 + 修饰符注册热键,并要求同时按下其他键
- 设置在热键触发时执行的Rust回调函数或闭包
- 对虚拟键(
VK_*
常量)和修饰键(MOD_*
常量)的高级Rust抽象 - 从键名字符串创建
VKey
(虚拟键)和ModKey
(修饰键)
如何使用
- 创建一个
HotkeyManager
实例 - 通过指定一个
VKey
和一个或多个ModKey
,以及一个回调来注册热键 - 运行事件循环以响应传入的热键触发
use windows_hotkeys::keys::{ModKey, VKey};
use windows_hotkeys::{HotkeyManager, HotkeyManagerImpl};
fn main() {
let mut hkm = HotkeyManager::new();
hkm.register(VKey::A, &[ModKey::Alt], || {
println!("Hotkey ALT + A was pressed");
})
.unwrap();
hkm.event_loop();
}
多线程
由于Windows API的限制,热键事件只能在最初注册的同一线程上接收和注销。这意味着一个正常的singlethreaded::HotkeyManager
实例不能在线程之间移动。
使用windows-hotkeys
的singlethreaded
API进行多线程操作仍然是可能的,但必须在同一线程上创建和使用singlethreaded::HotkeyManager
。
但是,通过默认启用的threadsafe
功能,添加了threadsafe::HotkeyManager
实现,这解决了该问题并提供默认的HotkeyManager
实现。
这是通过在实例化一个监听通道接收器的threadsafe::HotkeyManager
时启动一个后台线程来完成的。对于每个HotkeyManager
函数都有一个命令,并且在收到命令后,将从同一线程调用匹配的函数。这个threadsafe::HotkeyManager
只不过是一个存根,通过这些通道命令控制实际的后端线程。这样,无论存根函数是从哪里调用的,所有的热键函数都是在同一线程上执行的。
依赖项
~0.3–1MB
~20K SLoC