| Crates.io | handy-keys |
| lib.rs | handy-keys |
| version | 0.1.4 |
| created_at | 2026-01-14 09:04:22.229434+00 |
| updated_at | 2026-01-19 12:50:12.558446+00 |
| description | Cross-platform global keyboard shortcuts library |
| homepage | |
| repository | https://github.com/handy-computer/handy-keys |
| max_upload_size | |
| id | 2042463 |
| size | 140,015 |
Cross-platform global keyboard shortcuts library for Rust.
Cmd+Shift without a key"Ctrl+Alt+Space"Serialize/Deserialize[dependencies]
handy-keys = "0.1"
use handy_keys::{HotkeyManager, Hotkey, Modifiers, Key};
fn main() -> handy_keys::Result<()> {
let manager = HotkeyManager::new()?;
// Register using the type-safe constructor
let hotkey = Hotkey::new(Modifiers::CMD | Modifiers::SHIFT, Key::K)?;
let id = manager.register(hotkey)?;
// Or parse from a string
let hotkey2: Hotkey = "Ctrl+Alt+Space".parse()?;
manager.register(hotkey2)?;
// Listen for events
while let Ok(event) = manager.recv() {
println!("Hotkey triggered: {:?}", event.id);
}
Ok(())
}
Requires accessibility permissions. The library provides helpers to check and request access:
use handy_keys::{check_accessibility, open_accessibility_settings};
if !check_accessibility() {
open_accessibility_settings()?;
}
Uses low-level keyboard hooks. No special permissions required.
Uses rdev. On Wayland, hotkey blocking may not work due to compositor restrictions.
| Modifier | Aliases |
|---|---|
CMD |
command, meta, super, win |
CTRL |
control |
OPT |
option, alt |
SHIFT |
|
FN |
function (macOS only) |
For implementing "press a key to set hotkey" UI:
use handy_keys::KeyboardListener;
let listener = KeyboardListener::new()?;
println!("Press a key combination...");
while let Ok(event) = listener.recv() {
if event.is_key_down {
if let Ok(hotkey) = event.as_hotkey() {
println!("Recorded: {}", hotkey);
break;
}
}
}
MIT