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等元键的问题。这是权限问题导致的,解决方法:
- 打开macOS系统偏好设置
- 进入"安全性与隐私"
- 向下滚动到"辅助功能"并解锁
- 将使用
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));
}
}
注意事项
- 在Linux上可能需要权限才能监听全局输入
- 长时间运行的监听循环应该包含适当的延迟(
thread::sleep
)以减少CPU使用率 - 某些特殊键可能在不同平台上表现不同
device_query
库提供了简单直观的方式来监听输入设备,适合需要处理键盘鼠标输入的各种应用场景。