#mouse-event #mouse #keyboard #wheel #uiohook #libuiohook

uiohook-rs

uiohook-rs is a Rust wrapper for the libuiohook, providing cross-platform keyboard and mouse hooking capabilities

8 releases

new 0.2.6 Feb 15, 2025
0.2.5 Feb 13, 2025
0.2.3 Aug 17, 2024
0.1.0 Aug 10, 2024

#494 in Hardware support

Download history 5/week @ 2024-12-07 83/week @ 2025-02-01 149/week @ 2025-02-08

233 downloads per month

GPL-3.0 license

540KB
8K SLoC

C 7K SLoC // 0.2% comments Rust 1.5K SLoC // 0.1% comments

uiohook-rs

Crates.io

uiohook-rs is a Rust wrapper for the libuiohook, providing cross-platform keyboard and mouse hooking capabilities.

Features

  • Cross-platform support (Linux, macOS, Windows)
  • Low-level keyboard and mouse event handling
  • Easy-to-use Rust API

Note: All examples have now been tested on macOS, Windows and Linux.
On macOS the examples have been updated to use the CoreFoundation run loop (CFRunLoop) for proper event dispatch and exit.

Usage

Here's a basic example of how to use uiohook-rs:

use uiohook_rs::{EventHandler, Uiohook, UiohookEvent};

struct MyEventHandler;

impl EventHandler for MyEventHandler {
    fn handle_event(&self, event: &UiohookEvent) {
        println!("Event: {:?}", event);
    }
}

fn main() {
    let event_handler = MyEventHandler;
    let uiohook = Uiohook::new(event_handler);

    if let Err(e) = uiohook.run() {
        eprintln!("Error: {}", e);
    }
    
    // Stop the hook
    if let Err(e) = uiohook.stop() {
        eprintln!("Error: {}", e);
    }
}

Running the Demo

There are several example programs available under the examples/ directory, including demos for general event handling (demo.rs), pretty-printed output (pretty_demo.rs), and specific handlers for keyboard, mouse, and wheel events. Except for the pretty_demo.rs, all other examples use the minimal code to demonstrate the hook functionality.

To run the demo:

  1. Clone the repo:

    git clone https://github.com/efJerryYang/uiohook-rs.git
    cd uiohook-rs
    
  2. Run the demo:

    cargo run --example demo
    
  3. Press Ctrl-C to exit. See the output:

    Press Ctrl-C to exit
    MOVED    | Mouse             | X: 802   | Y: 644   | Button: 0    | Clicks: 0   
    PRESSED  | Caps Lock         | Code: 58    | Raw: 65509
    RELEASED | Caps Lock         | Code: 58    | Raw: 65509
    PRESSED  | Caps Lock         | Code: 58    | Raw: 65509
    RELEASED | Caps Lock         | Code: 58    | Raw: 65509
    PRESSED  | Left Shift        | Code: 42    | Raw: 65505
    PRESSED  | B                 | Code: 48    | Raw: 66   
    TYPED    | B                 | Code: 66    | Raw: 66   
    RELEASED | B                 | Code: 48    | Raw: 66   
    RELEASED | Left Shift        | Code: 42    | Raw: 65505
    PRESSED  | H                 | Code: 35    | Raw: 104  
    TYPED    | h                 | Code: 104   | Raw: 104  
    RELEASED | H                 | Code: 35    | Raw: 104  
    PRESSED  | Mouse             | X: 802   | Y: 644   | Button: 1    | Clicks: 1   
    RELEASED | Mouse             | X: 802   | Y: 644   | Button: 1    | Clicks: 1   
    CLICKED  | Mouse             | X: 802   | Y: 644   | Button: 1    | Clicks: 1   
    PRESSED  | Mouse             | X: 802   | Y: 644   | Button: 1    | Clicks: 1   
    DRAGGED  | Mouse             | X: 803   | Y: 644   | Button: 0    | Clicks: 1   
    ... (more DRAGGED events)
    DRAGGED  | Mouse             | X: 920   | Y: 630   | Button: 0    | Clicks: 0   
    DRAGGED  | Mouse             | X: 921   | Y: 630   | Button: 0    | Clicks: 0   
    RELEASED | Mouse             | X: 921   | Y: 630   | Button: 1    | Clicks: 0   
    PRESSED  | Left Control      | Code: 29    | Raw: 65507
    PRESSED  | C                 | Code: 46    | Raw: 99   
    TYPED    | c                 | Code: 99    | Raw: 99   
    Exiting...
    

License

GNU General Public License v3.0, see LICENSE.

Dependencies

~2–11MB
~129K SLoC