这是什么
全局输入桥(GlobalInputBridge)是一个面向 Windows 平台的 Unreal Engine 输入插件,核心能力是向游戏线程传递不依赖窗口焦点的全局键盘/鼠标输入——即使 UE 应用在后台运行,也能持续接收输入。
目标场景:UE 作为伴随程序运行在前台软件后面——虚拟主播直播(玩 FPS 时同步镜像瞄准与移动)、宏面板、输入分析、覆盖层工具等。
核心亮点:即使前台是采用 Raw Input 并把系统光标锁定在屏幕中心的 FPS 游戏(如《Hunt: Showdown》),鼠标瞄准增量依然能持续获取——因为移动数据来自 WM_INPUT 原始相对增量,与游戏本身读取的是同一份数据。
插件是纯被动读取器:绝不注入或合成输入,也不替代项目中的 Enhanced Input。
特性
- 全局键盘:后台 Windows Raw Input 工作线程(RIDEV_INPUTSINK),无论焦点如何都接收按键;支持多设备聚合与热插拔处理
- 全局鼠标移动:四种跟踪模式,默认 Raw Input——不受光标锁定、指针加速、DPI 缩放影响;另有 Polling(桌面像素增量)、Buttons Only(仅按钮)、Disabled(禁用)
- 事件节点:类 Enhanced Input 生命周期(Started / Triggered / Completed)、修饰键组合、可选的独占修饰键精确匹配,无需手动 Bind/Unbind
- 状态查询、广播事件与事件过滤(允许/排除列表,只影响广播不影响状态跟踪)
- 调试支持、覆盖状态管理器、和弦绑定、键映射,以及可编辑器内运行的自动化测试
主要蓝图节点
| 类别 | 节点 |
|---|---|
| 子系统 | Get Engine Subsystem → GlobalInputSubsystem、Start Listening |
| 状态查询 | Is Global Key Down、Was Global Key Pressed/Released This Frame、Get Pressed Global Keys |
| 鼠标 | Get Global Mouse Delta、On Global Mouse Move |
| 事件 | Global Input Action Event(紫色节点)、On Global Key Event |
| 过滤 | Set Global Input Event Filter、Clear Global Input Event Filter |
| 调试 | Get Global Input Debug Info、Set Log Level |
安装
- 克隆或下载仓库到
<YourProject>/Plugins/GlobalInputBridge - 重新生成项目文件并编译(或直接启动项目让编辑器构建)
- 启用插件;设置位于 Project Settings > Plugins > Global Input Bridge
环境要求:UE 5.7(开发测试版本,其他 UE 5.x 未经测试);仅 Windows x64。
快速上手
- 插件自带 DemoMap(Content 文件夹),包含所有功能的蓝图示例
- 在设置中启用 Auto Start,或自行调用 Start Listening(Commandlet 与专用服务器永不自动启动)
- 持续行为 → 查询
Is Global Key Down;一次性行为 → 查询按下/松开的帧边沿 - 鼠标瞄准 → 每 tick 读取
Get Global Mouse Delta,或绑定On Global Mouse Move - 典型瞄准镜像流程:每 tick 累积鼠标增量 → 乘以灵敏度系数 → 驱动 Aim Offset。注意 Raw Input 增量是设备计数(无指针加速),缩放系数需自行调校
鼠标跟踪模式对比
| 模式 | 移动增量 | 光标锁定游戏中 |
|---|---|---|
| Raw Input(默认) | WM_INPUT 原始相对计数 | 有效 |
| Polling | 桌面像素差 | 增量为零 |
| Buttons Only | 无 | On Global Mouse Move 永不广播 |
| Disabled | 无 | 键盘监听在所有模式下不受影响 |
技术实现
- 线程架构:专用工作线程运行隐藏 Win32 消息窗口,以 RIDEV_INPUTSINK 注册键鼠设备集合;数据包经单生产者/单消费者队列传递,在引擎子系统 tick 中由游戏线程消费
- 注册心跳机制(关键设计):Windows 限制每个进程每类设备只允许一个 Raw Input 目标窗口,后注册者生效。UE 自身的视口高精度鼠标模式会反复抢占该槽位,因此工作线程在停止收到鼠标输入后按 500ms 心跳重新注册自身(最多丢失半秒移动数据);跨进程注册互不冲突,前台游戏不受影响
- 线程安全:所有 UObject 访问、状态与蓝图广播均在游戏线程;工作线程只触碰 Win32 API 和队列
限制
- 仅限 Windows(PLATFORM_WINDOWS 守卫全部平台代码)
- 纯被动读取,不能阻止/修改输入,不可作为输入注入器
- Raw Input 鼠标增量是设备计数,需要像素语义请自行缩放
- MIT 许可证