这是我的测试代码,在 macos 上运行:
rust
use log::{error, info};
use rdev::{listen, Event, EventType};
use std::io::{self, Write};
fn main() {
// 初始化日志
env_logger::init();
info!("Input listener process started");
// 监听输入事件
if let Err(error) = listen(callback) {
error!("Listening error: {:?}", error);
std::process::exit(1);
}
}
fn callback(event: Event) {
let result = std::panic::catch_unwind(|| {
match event.event_type {
EventType::KeyPress(key) => {
let event_data = format!("KeyPress:{:?}", key);
println!("{}", event_data);
io::stdout().flush().unwrap();
}
EventType::KeyRelease(key) => {
let event_data = format!("KeyRelease:{:?}", key);
println!("{}", event_data);
io::stdout().flush().unwrap();
}
EventType::ButtonPress(button) => {
let event_data = format!("ButtonPress:{:?}", button);
println!("{}", event_data);
io::stdout().flush().unwrap();
}
EventType::ButtonRelease(button) => {
let event_data = format!("ButtonRelease:{:?}", button);
println!("{}", event_data);
io::stdout().flush().unwrap();
}
EventType::MouseMove { x, y } => {
// 鼠标移动事件太频繁,选择性记录
// let event_data = format!("MouseMove:{}:{}", x, y);
// println!("{}", event_data);
}
EventType::Wheel { delta_x, delta_y } => {
let event_data = format!("Wheel:{}:{}", delta_x, delta_y);
println!("{}", event_data);
io::stdout().flush().unwrap();
}
}
});
if let Err(e) = result {
eprintln!("Callback panicked: {:?}", e);
}
}
当我在启动 rdev 的监听后,可以正常监听鼠标按键、滚轮,也可以正常监听使用英文输入法时的键盘按键,但是当我切换到中文输入法后,尝试打字将导致整个程序异常退出。
因为没有日志难以定位问题,我查看了仓库的相关 issue,这个问题早在 23 年就有了,我看到了有人提交了解决的 PR:https://github.com/Narsil/rdev/pull/91
我使用的 0.4.6 版本按道理早已修复了该问题,但是不知道 rdev 的版本管理是怎么进行的,我目前测试发现仍然存在这个问题。
不过 rust 依赖支持将版本固定到某个 commit,没办法只有使用这种方法来保证问题不再发生:
toml
rdev = { git = "https://github.com/Narsil/rdev.git", rev = "3d0ec1d3bb106e889466e20bd83b273e66066cc4" }
相关 issue: https://github.com/Narsil/rdev/issues/86#issuecomment-1605995881