资讯动态

Deskflow实现原理

发布时间:2026/10/24 4:14:50 来源:尧图企业网站定制
你了解这个项目吗是GitHub上的开源项目GitHub - deskflow/deskflow: Share a single keyboard and mouse between multiple computers. · GitHub了解。Deskflow 是一款跨电脑共享键盘和鼠标的开源软件可以让你用一套键鼠控制多台电脑。例如你的 Windows 和 Linux 电脑各自连接显示器鼠标移到屏幕边缘就能切换到另一台电脑键盘输入随之切换还能共享剪贴板。它支持 Windows、macOS 和 Linux默认启用TLS 加密它不传输屏幕画面。我也看了你当前目录里的源码主要结构是目录作用src/appsGUI、核心程序和后台服务入口src/lib/gui图形界面src/lib/server、client服务端与客户端逻辑src/lib/net网络通信src/lib/platform各操作系统相关实现src/unittests单元测试本地代码采用C20、Qt 和 CMake。如果你准备研究源码、编译运行或者修改功能我们可以直接基于这个目录继续。它的原理是什么为什么可以实现一个电脑作为服务端让另一台电脑作为客户端使用服务端的键盘和鼠标?它的核心原理是服务端捕获键鼠事件通过网络发送给客户端客户端再调用操作系统接口模拟对应的键鼠操作。传输的是“按下了哪个键、鼠标移动到哪里”等事件数据。电脑 A服务端 电脑 B客户端 物理键盘、鼠标 ↓ 操作系统接收输入 ↓ Deskflow 捕获输入事件 ─── 网络传输 ──→ Deskflow 解析事件 ↓ 调用系统输入接口 ↓ B 上的应用接收输入服务端怎么知道你按了什么操作系统提供了监听键鼠输入的接口。以 Windows 为例Deskflow 使用SetWindowsHookEx安装低级键盘和鼠标钩子监听按键按下、松开、鼠标移动、点击和滚轮等事件。对应实现在 [MSWindowsHook.cpp (line 670)](D:/QtCode/deskflow-master/deskflow-master/src/lib/platform/MSWindowsHook.cpp:670)。比如你按下A程序就可以获取这个按键及其修饰键状态例如是否同时按着 Shift、Ctrl。怎么决定控制哪台电脑服务端维护着各台电脑的屏幕布局以及“当前正在控制的电脑”。假设配置成[电脑 A] [电脑 B]鼠标在 A 屏幕内时输入作用于 A。鼠标到达 A 的右边缘、满足切换条件后Deskflow 将当前控制目标改为 B并计算鼠标进入 B 屏幕的位置。控制 B 期间服务端会拦截需要转发的输入避免同一次操作也作用到 A 的普通应用。相关判断和事件分发主要在 [Server.cpp (line 1611)](D:/QtCode/deskflow-master/deskflow-master/src/lib/server/Server.cpp:1611)。网络里发送的是什么它把事件编码成自己的协议消息例如键盘按下 A、松开 A、按下 Ctrl 鼠标移动到 (300, 200)、左键按下、滚轮滚动实际传输使用二进制字段并不是上面这样的文字。源码中的鼠标移动消息标识是DMMV键盘按下消息根据协议版本使用DKDN或DKDL。客户端主动连接服务端默认使用TCP 24800 端口。连接建立后服务端就可以持续向客户端发送输入事件。“客户端主动连接”并不妨碍它接收服务端发来的控制数据。客户端为什么能让其他程序收到这些操作因为操作系统也提供了生成模拟输入的接口。例如 Windows 的SendInput可以向系统输入流注入键盘和鼠标事件。Deskflow 收到远端事件后进行按键映射、坐标处理等转换再调用这些接口。项目中的相关实现可以看到 [MSWindowsDesks.cpp (line 93)](D:/QtCode/deskflow-master/deskflow-master/src/lib/platform/MSWindowsDesks.cpp:93)。所以当 B 上的文本编辑器获得焦点时你在 A 的键盘上打字B 的编辑器就能收到输入。模拟输入仍受操作系统权限和安全规则限制。跨平台也是相同思路网络层传递统一的事件各平台代码负责把事件转换成本系统的输入操作。因此服务端和客户端不需要使用相同的操作系统。所以某种程度上我如果只希望共用一套键盘则可以自己实现一个简单的版本。让我当前的键盘操作都发送给客户端对应的电脑然后让它做出响应就实现了一版简单的共用键盘软件。对你理解得很准确。如果只做两台电脑之间的键盘转发完全可以自己实现一个简化版。基本流程就是A 捕获键盘事件 → 网络发送 → B 接收事件 → 模拟键盘输入以两台 Windows 电脑为例可以用A 端WH_KEYBOARD_LL键盘钩子捕获事件。通信TCP 连接发送按键编号、按下或松开等信息。B 端调用SendInput注入键盘事件交给当前获得焦点的应用处理。是的现有的程序太复杂了对我来说很不友好确实Deskflow 要兼顾跨平台、多屏切换、剪贴板同步和各种系统差异代码复杂度远超“把键盘输入转发到另一台电脑”这个需求。如果你的目标是自己理解、修改和使用可以把第一版缩小到两台 Windows 电脑一台连接键盘另一台接收输入。手动填写 IP通过 TCP 连接。用一个热键切换“控制本机 / 控制远端”。只转发键盘的按下、松开事件。断线后自动回到本机并释放远端按键。建议单独写一个小项目这样输入捕获、网络通信、输入模拟三部分都能看得清楚。先把基本功能跑通再按实际需要增加界面或其他功能。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑