QKeyMapper虚拟手柄实现原理:ViGEmBus驱动集成与vJoy按键发送全解
QKeyMapper虚拟手柄实现原理ViGEmBus驱动集成与vJoy按键发送全解【免费下载链接】QKeyMapper[按键映射工具] QKeyMapperQt开发Win10Win11可用不修改注册表、不需重新启动系统可立即生效和停止。支持游戏手柄映射到键鼠手柄摇杆控制鼠标移动键鼠映射到虚拟游戏手柄鼠标控制虚拟手柄移动摇杆等功能。项目地址: https://gitcode.com/gh_mirrors/qk/QKeyMapperQKeyMapper 是一款基于 Qt 开发的 Windows 键鼠映射工具其虚拟手柄功能可将键盘鼠标映射为 Xbox 360 / DualShock 4 虚拟游戏手柄核心依赖ViGEmBus 驱动完成设备仿真并通过 XUSB_REPORT 报告结构实现逐帧的按键与摇杆发送。本文带你从驱动集成到按键发送完整拆解这套机制。一、为什么需要虚拟手柄很多游戏只认手柄协议XInput / DS4不认键盘鼠标。QKeyMapper 的解决思路是正向映射物理游戏手柄 → 键盘鼠标通过 Interception 或 FakerInput 驱动注入反向映射本文重点键盘鼠标 →虚拟游戏手柄。系统里凭空插出一个 360 手柄游戏以为是真手柄插入按键、摇杆实时上报 小贴士安装驱动前建议在系统设置中关闭筛选键Windows 10 / Windows 11 路径略有不同可避免驱动安装异常。二、整体架构三层结构QKeyMapper 的虚拟手柄能力分为三层层次职责关键文件驱动层向系统注册虚拟设备ViGEmBusViGEmBusDriver.zip客户端层C API分配/连接/发送报告Client.h映射层按键匹配、状态机、报告组装qkeymapper_worker.cpp工程通过 QKeyMapper.pro 引入ViGEm/lib/x64/ViGEmClient.libx86 同理并以VIGEM_CLIENT_SUPPORT宏控制整条代码路径的编译开关。三、ViGEmBus 驱动虚拟手柄的总线ViGEmVirtual Gamepad Emulation的核心思想是先在系统中安装一个虚拟总线驱动ViGEmBus它相当于一条虚拟 USB 总线。任何程序都可以向总线申请插一个游戏手柄上去——这个动作对 Windows 而言与插入一个真实手柄完全等价。QKeyMapper 中对客户端的生命周期管理集中在 qkeymapper_worker.cpp按序调用分配ViGEmClient_Alloc() 调用vigem_alloc()创建客户端对象连接ViGEmClient_Connect() 调用vigem_connect()接入总线失败时会更新总线状态并提示插入设备ViGEmClient_AddTarget_byType() 分配目标手柄并调用vigem_target_add()等价于一次设备插入事件拔出与释放ViGEmClient_RemoveTarget() 依次执行vigem_target_remove()vigem_target_free()模拟拔出手柄。所有操作都受互斥锁s_ViGEmClient_Mutex保护避免多线程下报告发送冲突。四、两种虚拟手柄X360 与 DS4 ️ViGEmClient_AddTarget_byType() 根据用户选择的类型调用vigem_target_x360_alloc()或vigem_target_ds4_alloc()并为 360 手柄指定身份虚拟手柄Vendor IDProduct ID定义位置Xbox 3600x045E微软官方 VID0xABCDqkeymapper_constants.hDualShock 40x054C索尼官方 VID0x05C4同上使用与真机一致的 VID/PID能最大程度保证游戏兼容性。Xbox 360 手柄的按键布局如下也是映射时看到的按键标识来源五、vJoy 按键发送的核心报告结构Report这是整个机制最精华的部分。虚拟手柄的每一次按键本质都是向驱动提交一份 64 字节的状态报告。Xbox 360 使用XUSB_REPORT结构包含方向键、ABXY、LT/LT/RB 肩键、左摇杆 X/Y、右摇杆 X/Y 等字段DS4 使用DS4_REPORT通过XUSB_TO_DS4_REPORT宏可从 360 报告一键转换见 Common.h。发送路径非常直接摘自 qkeymapper_worker.cppif (DualShock4Wired vigem_target_get_type(ViGEmTarget)) { error vigem_target_ds4_update(s_ViGEmClient, ViGEmTarget, ds4_report); } else { error vigem_target_x360_update(s_ViGEmClient, ViGEmTarget, ViGEmTarget_Report); }完整数据流可以概括为键盘/鼠标事件 → 映射规则匹配 → 更新报告字段按键按下/摇杆偏移→vigem_target_x360_update()提交 → ViGEmBus 驱动 → 游戏读取 XInput 状态其中鼠标控制虚拟摇杆即源码中的 Mouse2vJoy 机制状态机定义见 qkeymapper_worker.h则是把鼠标移动量换算成摇杆 X/Y 轴值写入报告按下鼠标按钮则写入方向键字段手柄摇杆反向控制鼠标走的是 Interception 注入路径二者互不干扰。六、多手柄支持与状态管理QKeyMapper 不止能虚拟一个手柄s_ViGEmTargetList保存所有已插入的虚拟手柄目标支持一个物理设备对应多个虚拟手柄并可用 ViGEmClient_GamepadReset_byIndex() 按索引单独复位。退出映射时 ViGEmClient_RemoveAllTargets() 会逆序复位并拔出全部手柄——这就是可立即生效和停止、不重启系统的实现基础。七、常见问题速查 ️现象原因处理无法创建虚拟手柄总线未找到未安装 ViGEmBus 驱动安装 ViGEmBusDriver.zip 中的驱动包驱动版本不兼容客户端与总线版本不匹配VIGEM_ERROR_BUS_VERSION_MISMATCH使用项目自带的对应版本库手柄无法插入插槽占满VIGEM_ERROR_NO_FREE_SLOT关闭其他占用虚拟手柄的程序完整错误码定义可参考 Client.h。八、总结QKeyMapper 虚拟手柄的实现可以浓缩为一句话用 ViGEmBus 驱动伪造一条设备总线用vigem_target_*系列 API 管理虚拟手柄生命周期用 XUSB/DS4 报告结构逐帧上报按键与摇杆状态。得益于与真实硬件一致的 VID/PID 和标准报告格式绝大多数游戏无需任何适配即可识别。 延伸资料虚拟手柄相关状态机定义qkeymapper_worker.h客户端 C API 完整文档ViGEm/include/ViGEm/Client.h报告结构转换宏ViGEm/include/ViGEm/Common.h项目总体说明readme/QKeyMapper_README.md【免费下载链接】QKeyMapper[按键映射工具] QKeyMapperQt开发Win10Win11可用不修改注册表、不需重新启动系统可立即生效和停止。支持游戏手柄映射到键鼠手柄摇杆控制鼠标移动键鼠映射到虚拟游戏手柄鼠标控制虚拟手柄移动摇杆等功能。项目地址: https://gitcode.com/gh_mirrors/qk/QKeyMapper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考