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),仅供参考
企业数字化 ERP 产品动态
相关推荐
深入理解DOM:从HTML解析到虚拟DOM与性能优化实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:25:25
RV1106 + AIC8800DC:嵌入式蓝牙音频播放完整实践与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:25:25
OBJ贴图错乱的根源:纹理坐标与顶点索引对齐解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:25:25
博途CPU资源查看与设置:避免停机的关键实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:58:42
H5棋牌源码部署二次开发:从环境配置到WebSocket避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:58:42
FusionCompute单机实验手册:VRM+KVM最小集群实操指南 简介:本资源是华为HCIP-Cloud Computing V4.0认证配套的《FusionCompute实验手册1》,面向备考该认证的工程师、云计算运维人员及希望系统掌握华为服务器虚拟化平台FusionCompute部署与运维能力的技术从业者。手册覆盖从环境搭建到日常运维的完整实践路径… · 2026/9/25 1:58:42
STM32调试避坑指南:从BOOT0、SWD到Flash与OTA升级实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:58:42
免费SQL Server Profiler替代工具源码与C#财务管理系统实战 简介:一套完整的C#财务管理系统源码,围绕 SQL Server Profiler 性能优化实践展开,适合有一定 C# 基础、希望接触真实业务场景的开发者和在校学生。项目覆盖账务处理、报表生成、固定资产、成本核算、预算控制与用户权限等财务核心模块&#x… · 2026/9/25 1:58:36
电流检测电路设计核心:运放选型、PCB布局与抗干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:58:35
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37