Rust设备输入监听库device_query的使用,跨平台键盘鼠标事件捕获与查询工具

Rust设备输入监听库device_query的使用,跨平台键盘鼠标事件捕获与查询工具

简介

device_query是一个简单的Rust库,可以在不需要窗口的情况下查询鼠标和键盘输入。它支持Windows、Linux(X11)和macOS平台。

基本使用示例

use device_query::{DeviceQuery, DeviceState, MouseState, Keycode};

let device_state = DeviceState::new();
let mouse: MouseState = device_state.get_mouse();
println!("当前鼠标坐标: {:?}", mouse.coords);
let keys: Vec<Keycode> = device_state.get_keys();
println!("A键是否按下? {}", keys.contains(&Keycode::A));

依赖安装

在Windows上,device_query不需要安装任何特殊软件即可正常工作。

在Linux上,需要安装X11开发库:

Ubuntu/Debian:

sudo apt install libx11-dev

Fedora/RHEL/CentOS:

sudo dnf install xorg-x11-server-devel

在较新版本的macOS上,可能会遇到只能看到Shift、Backspace等元键的问题。这是权限问题导致的,解决方法:

  1. 打开macOS系统偏好设置
  2. 进入"安全性与隐私"
  3. 向下滚动到"辅助功能"并解锁
  4. 将使用device_query的应用程序(如终端)添加到列表中

设备回调功能

device_query允许你为各种设备事件(如按键和鼠标移动)注册回调。

回调示例

extern crate device_query;
use device_query::{DeviceEvents, DeviceEventsHandler, Keycode, MouseButton, MousePosition};
use std::thread;
use std::time::Duration;

fn main() {
    // 初始化事件处理器,设置10毫秒的休眠间隔
    let event_handler = DeviceEventsHandler::new(Duration::from_millis(10))
        .expect("无法初始化事件循环");

    // 为各种事件注册回调
    // 当回调超出作用域时会自动注销
    let _mouse_move_guard = event_handler.on_mouse_move(|position: &MousePosition| {
        println!("鼠标移动到位置: {:?}", position);
    });

    // 保持主线程运行以继续接收事件
    loop {
        thread::sleep(Duration::from_secs(1000));
    }
}

完整示例代码

下面是一个完整的示例,展示了如何使用device_query监听键盘和鼠标事件:

use device_query::{
    DeviceQuery, DeviceState, Keycode, 
    DeviceEvents, DeviceEventsHandler, MousePosition, MouseButton
};
use std::thread;
use std::time::Duration;

fn main() {
    // 1. 基本查询示例
    let device_state = DeviceState::new();
    
    // 获取鼠标状态
    let mouse = device_state.get_mouse();
    println!("鼠标位置: {:?}", mouse.coords);
    println!("按下的鼠标按钮: {:?}", mouse.button_pressed);
    
    // 获取键盘状态
    let keys = device_state.get_keys();
    println!("按下的按键: {:?}", keys);
    println!("A键是否按下: {}", keys.contains(&Keycode::A));
    
    // 2. 事件回调示例
    let event_handler = DeviceEventsHandler::new(Duration::from_millis(10))
        .expect("无法初始化事件处理器");
    
    // 注册鼠标移动回调
    let _mouse_move = event_handler.on_mouse_move(|pos: &MousePosition| {
        println!("鼠标移动: x={}, y={}", pos.0, pos.1);
    });
    
    // 注册鼠标点击回调
    let _mouse_down = event_handler.on_mouse_down(|button: &MouseButton| {
        println!("鼠标按下: {:?}", button);
    });
    
    // 注册鼠标释放回调
    let _mouse_up = event_handler.on_mouse_up(|button: &MouseButton| {
        println!("鼠标释放: {:?}", button);
    });
    
    // 注册键盘按下回调
    let _key_down = event_handler.on_key_down(|key: &Keycode| {
        println!("按键按下: {:?}", key);
    });
    
    // 注册键盘释放回调
    let _key_up = event_handler.on_key_up(|key: &Keycode| {
        println!("按键释放: {:?}", key);
    });
    
    // 保持程序运行
    loop {
        thread::sleep(Duration::from_secs(1));
    }
}

安装

在项目目录中运行以下Cargo命令:

cargo add device_query

或者在Cargo.toml中添加:

device_query = "4.0.1"

许可证

MIT License


1 回复

Rust设备输入监听库device_query的使用指南

device_query是一个跨平台的Rust库,用于监听和查询键盘鼠标输入事件。它支持Windows、Linux和macOS系统,可以方便地获取全局键盘和鼠标状态。

主要功能

  • 监听键盘按键状态
  • 监听鼠标按键和位置
  • 跨平台支持
  • 简单易用的API

基本使用方法

添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
device_query = "0.3.0"

监听键盘输入

use device_query::{DeviceQuery, DeviceState, Keycode};

fn main() {
    let device_state = DeviceState::new();
    
    loop {
        let keys: Vec<Keycode> = device_state.get_keys();
        if !keys.is_empty() {
            println!("当前按下的键: {:?}", keys);
        }
    }
}

监听鼠标输入

use device_query::{DeviceQuery, DeviceState};

fn main() {
    let device_state = DeviceState::new();
    
    loop {
        let mouse = device_state.get_mouse();
        println!("鼠标位置: {:?}, 按键: {:?}", mouse.coords, mouse.button_pressed);
    }
}

高级用法

组合键检测

use device_query::{DeviceQuery, DeviceState, Keycode};

fn main() {
    let device_state = DeviceState::new();
    
    loop {
        let keys = device_state.get_keys();
        if keys.contains(&Keycode::LControl) && keys.contains(&Keycode::C) {
            println!("检测到Ctrl+C组合键");
        }
    }
}

鼠标移动监听

use device_query::{DeviceQuery, DeviceState};

fn main() {
    let device_state = DeviceState::new();
    let mut last_position = (0, 0);
    
    loop {
        let mouse = device_state.get_mouse();
        if mouse.coords != last_position {
            println!("鼠标移动到: {:?}", mouse.coords);
            last_position = mouse.coords;
        }
    }
}

实际应用示例

简单的热键程序

use device_query::{DeviceQuery, DeviceState, Keycode};
use std::{thread, time::Duration};

fn main() {
    let device_state = DeviceState::new();
    
    println!("按下F1键退出程序...");
    
    loop {
        let keys = device_state.get_keys();
        if keys.contains(&Keycode::F1) {
            println!("检测到F1键,退出程序");
            break;
        }
        
        if keys.contains(&Keycode::LShift) && keys.contains(&Keycode::A) {
            println!("检测到Shift+A组合键");
        }
        
        thread::sleep(Duration::from_millis(50));
    }
}

鼠标点击计数器

use device_query::{DeviceQuery, DeviceState, MouseButton};
use std::{thread, time::Duration};

fn main() {
    let device_state = DeviceState::new();
    let mut click_count = 0;
    
    println!("鼠标点击计数器 (右键退出)...");
    
    loop {
        let mouse = device_state.get_mouse();
        
        if mouse.button_pressed.contains(&MouseButton::Left) {
            click_count += 1;
            println!("左键点击次数: {}", click_count);
            thread::sleep(Duration::from_millis(200)); // 防抖动
        }
        
        if mouse.button_pressed.contains(&MouseButton::Right) {
            println!("检测到右键点击,退出程序");
            break;
        }
        
        thread::sleep(Duration::from_millis(50));
    }
}

完整示例代码

use device_query::{DeviceQuery, DeviceState, Keycode, MouseButton};
use std::{thread, time::Duration};

fn main() {
    println!("设备输入监听程序启动");
    println!("功能列表:");
    println!("1. 按下F1键退出程序");
    println!("2. 按下Ctrl+C显示特殊提示");
    println!("3. 左键点击计数");
    println!("4. 右键点击退出");
    
    let device_state = DeviceState::new();
    let mut click_count = 0;
    let mut last_position = (0, 0);
    
    loop {
        // 监听键盘输入
        let keys = device_state.get_keys();
        if !keys.is_empty() {
            println!("当前按下的键: {:?}", keys);
            
            // 检测F1键退出
            if keys.contains(&Keycode::F1) {
                println!("检测到F1键,退出程序");
                break;
            }
            
            // 检测Ctrl+C组合键
            if keys.contains(&Keycode::LControl) && keys.contains(&Keycode::C) {
                println!("检测到Ctrl+C组合键 - 这是一个特殊操作");
            }
        }
        
        // 监听鼠标输入
        let mouse = device_state.get_mouse();
        
        // 检测鼠标移动
        if mouse.coords != last_position {
            println!("鼠标移动到: {:?}", mouse.coords);
            last_position = mouse.coords;
        }
        
        // 检测鼠标点击
        if mouse.button_pressed.contains(&MouseButton::Left) {
            click_count += 1;
            println!("左键点击次数: {}", click_count);
            thread::sleep(Duration::from_millis(200)); // 防抖动
        }
        
        if mouse.button_pressed.contains(&MouseButton::Right) {
            println!("检测到右键点击,退出程序");
            break;
        }
        
        // 降低CPU使用率
        thread::sleep(Duration::from_millis(50));
    }
}

注意事项

  1. 在Linux上可能需要权限才能监听全局输入
  2. 长时间运行的监听循环应该包含适当的延迟(thread::sleep)以减少CPU使用率
  3. 某些特殊键可能在不同平台上表现不同

device_query库提供了简单直观的方式来监听输入设备,适合需要处理键盘鼠标输入的各种应用场景。

回到顶部