Deskflow 键鼠共享技术原理简析转至元数据结尾
·
Deskflow 的键鼠共享技术核心在于 Client-Server(客户端-服务端)架构,其中 Server(服务端/Host) 负责捕获物理设备的输入并转发,Client(客户端/Remote) 负责接收指令并模拟虚拟输入。
以下是详细的技术原理分析,涵盖 Windows、macOS 和 Linux 三大平台。
1. 核心架构:Server 与 Client
- Server (服务端):连接物理键盘鼠标的电脑。它运行一个后台服务,监听系统的输入事件。当鼠标移动到屏幕边缘进入“被控端”区域时,服务端会拦截本地输入,通过网络将操作指令发送出去。
- Client (客户端):被控制的电脑。它接收来自网络的指令,并调用操作系统的底层 API 模拟出键盘鼠标动作,就像真的有硬件连接在上面一样。
2. 输入捕获 (Server 端技术)
这是技术难点之一,需要通过操作系统底层的 Hook(钩子)机制来截获输入,甚至在输入到达当前应用窗口之前将其拦截。
| 平台 | 核心 API / 技术 | 原理描述 |
|---|---|---|
| Windows | SetWindowsHookEx |
使用 WH_KEYBOARD_LL 和 WH_MOUSE_LL 低级钩子。这允许 Deskflow 在系统处理输入队列的最前端截获消息。当鼠标处于“远程控制”模式时,Deskflow 会返回 1 来阻止事件传递给本地系统(即“吃掉”事件),从而实现本地无响应。 |
| macOS | CGEventTapCreate |
利用 Quartz Event Services 创建一个 Event Tap(kCGHIDEventTap)。这类似于 Windows 的钩子,允许在系统层级过滤和修改输入事件。Deskflow 将其插入到 kCGHeadInsertEventTap 位置以确保高优先级。 |
| Linux (X11) | XGrabPointer / XGrabKeyboard |
使用 X11 协议的 Grab 机制。当控制权切换时,Deskflow 会独占鼠标和键盘的输入流。此时 X Server 会将所有事件直接发给 Deskflow 窗口,不再分发给其他应用。 |
| Linux (Wayland) | XDG Desktop Portal / libei |
现代 Linux (Wayland) 禁止全局输入捕获。Deskflow 通过 XDG Desktop Portal 请求 InputCapture 权限,并使用 libei (Emulated Input) 库与 Compositor (如 GNOME Shell/KWin) 通信来获取输入流。 |
3. 屏幕边缘检测与切换
Deskflow 维护了一个虚拟的屏幕布局坐标系。
- 位置追踪:Server 端持续监控鼠标坐标。
- 边缘判定:当坐标触碰到配置的屏幕边缘(例如主屏右侧)时,Server 计算目标屏幕是哪台设备。
- 模式切换:
- 锁定光标:Server 会将本地光标隐藏,或者将其“锁定”在屏幕中心(通过反复调用
WarpCursor将鼠标拉回中心),防止它误触本地任务栏或窗口。 - 协议转发:开始将捕获到的
WM_KEYDOWN或NSEvent转换为 Deskflow 的网络协议包。
- 锁定光标:Server 会将本地光标隐藏,或者将其“锁定”在屏幕中心(通过反复调用
4. 网络传输协议
Deskflow 使用自定义的 TCP 二进制协议进行极低延迟的通信。
- 消息类型:定义在
protocol_types.h中。kMsgDMouseMove(DMMV): 鼠标移动增量 (Delta X, Delta Y)。kMsgDKeyDown(DKDN) /kMsgDKeyUp(DKUP): 键盘按键码。
- 序列化:按键码(Keycode)通常会被映射为与平台无关的 ID,或者直接传输原始扫描码(Scancode),由接收端根据自身的键盘布局进行还原。
5. 输入模拟 (Client 端技术)
客户端收到网络包后,需要欺骗操作系统,让系统以为有硬件在操作。
| 平台 | 核心 API / 技术 | 原理描述 |
|---|---|---|
| Windows | SendInput |
这是 Windows 推荐的模拟输入 API。Deskflow 构造 INPUT 结构体(包含 MOUSEINPUT 或 KEYBDINPUT),直接注入到系统输入流中。 |
| macOS | CGEventPost |
创建虚拟事件 (CGEventCreateMouseEvent / CGEventCreateKeyboardEvent),然后通过 CGEventPost(kCGHIDEventTap, event) 将事件投递回系统事件队列。 |
| Linux (X11) | XTest Extension | 使用 X11 的 XTest 扩展库 (XTestFakeKeyEvent, XTestFakeMotionEvent)。这是 X11 标准的自动化测试接口,能够完美模拟硬件行为。 |
| Linux (Wayland) | uinput / libei |
在 Wayland 下,客户端模拟输入通常较难,通常需要创建一个虚拟输入设备(uinput)或者同样利用 libei 的接收端功能,让 Compositor 认为有一个虚拟设备连接。 |
6. 剪贴板共享原理
除了键鼠,剪贴板同步也是核心功能。
- 监测:各平台都有剪贴板变更通知机制(如 Windows 的
AddClipboardFormatListener,macOS 的NSPasteboard轮询)。 - 所有权接管:当鼠标从 A 电脑 切换到 B 电脑时,Deskflow 不会立即传输剪贴板内容(因为可能很大)。它只会告诉 B 电脑:“现在剪贴板在我这里”。
- 按需传输:当用户在 B 电脑按下
Ctrl+V时,B 电脑的 Deskflow 请求数据,A 电脑才将内容序列化(文本、图片、HTML)并通过网络发送。
总结
Deskflow 的技术本质是系统级钩子(Hooks)与系统级注入(Injection)的结合,中间通过TCP 网络桥接。它深入到了操作系统的窗口管理子系统(Windows User32, macOS Quartz, Linux X11/Wayland),因此对系统权限要求极高(通常需要辅助功能权限)。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)