#hotkey #winapi #global #key-pressed #windows #system-wide

windows-hotkeys

一个简单的线程安全抽象,用于管理Windows上的全局热键

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日

#53Windows API

每月下载量 35

MIT 许可证

58KB
1K SLoC

Windows Hotkeys

Crates.io Crates.io Docs.rs

一个轻量级的crate,用于处理Windows上的全局热键

windows-hotkeys crate对winapi的所有交互进行抽象和处理,包括注册热键、处理事件并提供线程安全的访问。使用热键管理器实例注册键组合以及易于使用的回调。

特性

  • 可在多个线程中使用,绕过WinAPI对热键API同一线程的要求
  • 对winapi函数和事件的完整高级抽象
  • 易于使用
  • 使用键 + 修饰符注册热键
  • 使用键 + 修饰符注册热键,并要求同时按下其他键
  • 设置在热键触发时执行的Rust回调函数或闭包
  • 对虚拟键(VK_*常量)和修饰键(MOD_*常量)的高级Rust抽象
  • 从键名字符串创建VKey(虚拟键)和ModKey(修饰键)

如何使用

  1. 创建一个HotkeyManager实例
  2. 通过指定一个VKey和一个或多个ModKey,以及一个回调来注册热键
  3. 运行事件循环以响应传入的热键触发
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-hotkeyssinglethreaded API进行多线程操作仍然是可能的,但必须在同一线程上创建和使用singlethreaded::HotkeyManager

但是,通过默认启用的threadsafe功能,添加了threadsafe::HotkeyManager实现,这解决了该问题并提供默认的HotkeyManager实现。

这是通过在实例化一个监听通道接收器的threadsafe::HotkeyManager时启动一个后台线程来完成的。对于每个HotkeyManager函数都有一个命令,并且在收到命令后,将从同一线程调用匹配的函数。这个threadsafe::HotkeyManager只不过是一个存根,通过这些通道命令控制实际的后端线程。这样,无论存根函数是从哪里调用的,所有的热键函数都是在同一线程上执行的。

依赖项

~0.3–1MB
~20K SLoC