本项目是一套基于 RocketMQ 广播通信与 Windows 原始输入(Raw Input)/DirectInput 采集的网络键鼠同步器:
将主控机的键盘与鼠标相对位移/按键事件实时发布到消息队列,使多台从机在不同账号/不同客户端中执行一致输入,从而实现“一套键鼠同时控制多台电脑”的同步操作。
适用场景:窗口锁鼠标/游戏相对位移输入(如第一人称/战术射击/需捕获 Raw Mouse Delta 的游戏)。
针对“喀拉壁球”场景完成关键改造与实机测试。
-
测试视频
out_10mb.mp4
传统 WH_MOUSE_LL 低级钩子读取的是屏幕坐标,遇到游戏“鼠标回正到屏幕中心/隐藏光标”会导致同步失真。
本项目已将 Master 鼠标采集替换为 JInput DirectAndRawInputEnvironmentPlugin(RawMouseInputJInput),直接读取鼠标 相对移动量 deltaX/deltaY,从根源上适配游戏输入模型。
- Master:
Client/DNFMaster.java使用Hooker/RawMouseInputJInput - MouseMessage 扩展:新增
deltaX/deltaY/wheelDelta/isRelativeMode - Slave:
MessageConsumer/MouseMessageConsumer.java支持相对移动注入(SendInput+ dx/dy)
键鼠事件天然有序(尤其鼠标拖拽、按下/抬起序列),本项目通过 RocketMQ:
- Master 发布 KeyboardActions / MouseActions
- Slave 广播订阅并顺序消费,避免并发打乱输入序列
- 鼠标事件采用
producer.sendOneway()单向发送,降低阻塞对采集线程的影响 - 监听线程独立运行,并在 Master 增加 shutdown hook 做资源回收
[Master]
RawMouseInputJInput / Keyboard Hook
|
v
RocketMQ Topics (MouseActions / KeyboardActions / ControlMessage)
|
v
[Slave x N]
顺序消费 -> 反序列化 -> SendInput 注入
- Windows(输入采集与注入依赖 Win32)
- Java 8+
- RocketMQ(建议 Docker 部署)
仓库内已提供部署笔记:rocketmq_delopy.md(按环境可改 IP/路径)。
配置文件示例(本仓库已新增):
config.properties或src/main/java/Client/config.properties
字段:
NameServerAddr = <ip>:9876SlaveName = <slave-id>
- 启动 RocketMQ NameServer + Broker + Dashboard
- Master 机器启动
DNFMaster(主控端采集并发布) - 各 Slave 机器启动
DNFSlave(订阅并注入) - 使用 Dashboard 向
ControlMessage发送 tag:enable:开启同步disable:关闭同步
- 游戏常使用 Raw Input/DirectInput 获取相对位移,而不是读屏幕坐标
WH_MOUSE_LL在“鼠标回正/锁定中心”的场景下很难还原真实相对位移- JInput 的 Direct+Raw 插件能提供更贴近游戏输入的 delta 数据
为适配相对位移注入,本仓库在 Entity/MouseMessage 中新增:
deltaX,deltaY:相对位移wheelDelta:滚轮isRelativeMode:相对模式标记(用于区分坐标模式/相对模式)
MouseMessageConsumer 对 MOUSEEVENTF_MOVE:
- 若存在
deltaX/deltaY:使用SendInput进行相对移动注入 - 否则回退到
SetCursorPos(x,y)的坐标模式
- 本项目用于输入同步研究与测试,请自行评估目标软件/游戏的用户协议与风险。
- 多机同步可能触发目标软件的行为检测;请谨慎使用并控制频率。
target/native-libs/*.dll属于 JInput 原生依赖,建议后续改为打包阶段自动生成/拷贝,避免将二进制直接提交进仓库。
- Master 入口:
src/main/java/Client/DNFMaster.java - Slave 入口:
src/main/java/Client/DNFSlave.java - Raw Mouse 采集:
src/main/java/Hooker/RawMouseInputJInput.java - 消费与注入:
src/main/java/MessageConsumer/MouseMessageConsumer.java - RocketMQ 部署:
rocketmq_delopy.md