1. 问题现象与背景分析
最近在开发一个MacOS平台的键鼠事件监听工具时,遇到了一个棘手的问题:当系统切换到中文输入法时,使用rdev库的监听程序会异常退出。这个问题在英文输入状态下完全正常,但只要切换到拼音、五笔等中文输入法,程序就会立即崩溃。
rdev是一个用Rust编写的跨平台输入设备监听库,它提供了统一的接口来捕获键盘和鼠标事件。在MacOS上,它底层依赖Core Graphics框架的事件监听机制。理论上应该能稳定工作,但实际使用中却出现了输入法相关的兼容性问题。
注意:这个问题并非rdev特有,其他语言(如C++、Python)通过类似机制监听系统事件时,也可能遇到输入法导致的异常情况。
2. 输入法事件处理机制解析
2.1 MacOS输入事件传递流程
MacOS的输入事件处理流程比较特殊:
- 硬件事件首先由WindowServer接收
- 然后传递给当前激活的输入法处理器(Input Method Handler)
- 经过输入法转换后,最终传递给应用程序
中文输入法在这个过程中会修改事件流。例如:
- 输入"nihao"时,输入法会先接收这5个字母的keydown事件
- 然后输出"你好"的composition事件
- 最后提交(commit)最终的文本
2.2 rdev的事件捕获机制
rdev通过CGEventTapCreate捕获原始事件。这个API提供了几种监听级别:
cgSessionEventTap:会话级别,能捕获所有事件cgAnnotatedSessionEventTap:带注释的会话事件cgHIDEventTap:硬件级别事件
问题出在事件回调函数的处理上。当输入法处于组合输入状态时,某些事件参数可能为NULL或不完整,而rdev的默认实现没有充分处理这些特殊情况。
3. 问题定位与调试方法
3.1 崩溃日志分析
首先通过控制台查看崩溃日志,发现关键错误信息:
code复制Thread 0 Crashed:
0 libsystem_kernel.dylib 0x00007fff... __pthread_kill
1 libsystem_pthread.dylib 0x00007fff... p
