使用 rust / rdev 在 macos 上监听键鼠事件,但在使用中文输入法时异常退出

这是我的测试代码,在 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" }

相关 issuehttps://github.com/Narsil/rdev/issues/86#issuecomment-1605995881

相关推荐
葫芦和十三8 小时前
图解 MongoDB 19|Oplog:复制的真正载体,不是文档是操作
后端·mongodb·agent
葫芦和十三8 小时前
图解 MongoDB 20|复制延迟与 catch up:Secondary 为什么跟不上
后端·mongodb·agent
花褪残红青杏小10 小时前
Rust图像处理第6节- 均值模糊 & 中值模糊:3×3 邻域的两种经典玩法
rust·webassembly·图形学
IT_陈寒13 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
ServBay14 小时前
为什么说 MCP 是 2026 年开发者必须掌握的黄金协议?
后端·mcp
程序员夏洛14 小时前
Spring Boot 多模块项目中 IDEA 提示 Cannot resolve symbol 的一次排查记录
后端
子兮曰14 小时前
OpenMontage 深度解剖:你的 AI 编程助手,其实是个视频工作室
前端·后端·ai编程
子兮曰14 小时前
前端工具链的「Rust 化」:一场没有赢家的军备竞赛?
前端·后端·rust
爱勇宝15 小时前
从 Ctrl+CV 到 Enter:程序员正在失去什么
前端·后端·程序员