首页
/ Lan Mouse 源码深度解析:从事件捕获到网络传输的完整实现

Lan Mouse 源码深度解析:从事件捕获到网络传输的完整实现

2026-02-06 04:49:11作者:段琳惟

Lan Mouse 是一个基于 Rust 语言开发的跨平台鼠标键盘共享软件,可以实现类似于苹果 Universal Control 的功能。它允许用户使用一套鼠标键盘控制多台计算机,相当于软件 KVM 切换器。🚀

项目架构概览

Lan Mouse 采用模块化设计,核心功能分布在多个独立的 crate 中:

  • input-capture:负责捕获本地输入事件
  • input-emulation:负责在远程设备上模拟输入事件
  • lan-mouse-proto:定义网络通信协议格式
  • lan-mouse-ipc:处理进程间通信
  • lan-mouse-gtk:提供图形用户界面

Lan Mouse 深色主题界面 Lan Mouse 深色主题界面,展示连接管理和授权功能

事件捕获机制深度剖析

src/capture.rs 中,Lan Mouse 实现了高效的事件捕获系统:

捕获状态管理

enum State {
    WaitingForAck,  // 等待客户端确认
    Sending,         // 正在发送事件
}

系统通过 CaptureTask 结构体管理多个捕获客户端,每个客户端关联一个特定的屏幕位置(左、右、上、下)。

智能防抖处理

Lan Mouse 实现了 debounce! 宏来防止事件重复触发:

macro_rules! debounce {
    ($prev:ident, $dur:expr, $st:stmt) => {
        // 只有在距离上次执行超过指定时间时才执行语句
    }
}

输入模拟引擎详解

src/emulation.rs 文件定义了输入模拟的核心逻辑:

连接生命周期管理

系统通过 EmulationEvent 枚举来跟踪连接状态:

enum EmulationEvent {
    Connected { addr: SocketAddr, fingerprint: String },
    Disconnected { addr: SocketAddr },
    // ... 其他事件类型
}

Lan Mouse 浅色主题界面 Lan Mouse 浅色主题界面,保持相同的功能布局

网络协议层设计

lan-mouse-proto/src/lib.rs 定义了完整的通信协议:

协议事件类型

enum ProtoEvent {
    Enter(Position),   // 光标进入客户端区域
    Leave(u32),       // 光标离开客户端区域
    Input(InputEvent), // 输入事件传输
    Ping,            // 心跳检测
    Pong(bool),     // 心跳响应
}

多平台后端支持

Lan Mouse 支持多种输入后端:

输入捕获后端

  • layer-shell:适用于 wlroots 合成器
  • libei:适用于 GNOME 和 KDE Plasma
  • windows:Windows 平台专用
  • macos:macOS 平台专用

输入模拟后端

  • wlroots:虚拟指针和键盘协议
  • libei:标准化输入仿真
  • xdp:远程桌面门户

加密与安全机制

所有网络流量都使用 DTLS 加密,基于 WebRTC.rs 实现。系统通过证书指纹进行设备认证,确保只有授权设备可以建立连接。

配置系统解析

Lan Mouse 使用 TOML 格式的配置文件:

release_bind = [ "KeyA", "KeyS", "KeyD", "KeyF" ]
port = 4242

性能优化策略

  1. 零拷贝设计:事件数据直接在内存中传输
  2. 异步处理:基于 tokio 的异步运行时
  3. 智能缓冲:根据网络状况动态调整缓冲区大小

未来发展方向

  • X11 输入捕获支持
  • 延迟测量和可视化
  • 带宽使用监控
  • 剪贴板共享功能

Lan Mouse 通过精心的架构设计和高效的实现,为多设备协同工作提供了可靠的解决方案。其模块化设计也为未来的功能扩展奠定了坚实的基础。

登录后查看全文
热门项目推荐
相关项目推荐