如何创建虚拟游戏手柄?

Dat*_*bot 7 windows virtual gamecontroller

我将如何创建一个"游戏手柄",它似乎是DirectInput应用程序作为普通游戏控制器,但其控件的状态实际上是由软件定义的?

小智 8

写一个设备驱动程序假装是一个.

具体来说,Windows设备驱动程序处理所谓的通过中断请求协议中断请求 - 这可以归结为一个包裹结构,在驱动程序中的一组缓冲区内.

现在,您需要知道的下一件事是,许多驱动程序实际上是分层的,或堆叠的,或者您想要使用的任何名称.因此,例如,要编写磁盘驱动程序,您可以与其上方的驱动程序(作为磁盘类)进行交互,但使用其下方的驱动程序(例如scsi端口)来实际向您的设备发送命令.

这就是真实设备的工作原理.假设备需要符合顶级接口要求,例如磁盘,控制器或鼠标,或其他任何东西.然而,在他们下面他们可以做任何他们喜欢的事情 - 返回他们喜欢的任何价值

这开启了通过用户模式应用程序控制驱动程序并假装"成为"设备的可能性.要发送驱动程序消息,您可以DeviceIoControl执行此操作; 然后实际获得这些消息你可以:

  • 将它们填入构成DeviceIoControl的Irp中.
  • 让驱动程序从进程的内存空间中读取它们.

驱动程序还可以访问\\Registry\\Machine各种其他非用户特定的非资源管理器注册表区域,因此可以通过这种方式进行通信.

最后,不能说你不能过滤现有的IO,而不是通过新设备来完成.有很多选择和方法可以做到这一点.

如果你打算这样做,你需要:

  • VirtualKD或昂贵的调试器电缆和两台PC.
  • 您可能还想从这篇博客文章中的参考文献开始.你会发现驱动程序代码基本上有很多不同的名称,所以我会解释其中的一些:

    • WDM = Windows驱动程序模型,基本上是NT驱动程序模型与(部分)Windows 9x混合使用.
    • KMDF =内核模式驱动程序框架 - 上述类型的驱动程序使用此功能,另外还有WDF(Windows Driver Foundation),这是WDM之上的一组库,可以更快地使用它.
    • UMDF =用户模式驱动程序框架 - 在没有内核模式危险的情况下编写驱动程序.如果可以的话,使用它,作为内核模式驱动程序出错将会蓝屏(用驱动程序说法,错误检查)你的系统.

编辑:我对DirectInput没有大量的了解 - 可能有一种方法可以通过DLL重定向等覆盖使用中的各种API控件,这可能比我描述的方式更简单.


小智 6

有 vJoy 开源项目:http://sourceforge.net/projects/vjoystick/ - 值得一看。


gri*_*010 6

我知道这是一个老问题,但对于任何对此主题感兴趣的人来说,这个名为ViGEm 的项目也值得一看。

您可以模拟一些知名的游戏手柄,例如 Microsoft Xbox 360 控制器、Sony DualShock 4 控制器和 Microsoft Xbox One 控制器。该项目还提供了一些 API 来与这些虚拟控制器进行交互。例如,C# API 可以在这里找到


Jos*_*own 5

最简单的解决方案可能是模拟XInput设备(Xbox 360和One)。大多数现代游戏都支持这些功能,并且设置非常简单。这是一个C ++项目,可在不提供任何已安装驱动程序或外部依赖项的情况下提供此功能:https : //github.com/shauleiz/vXboxInterface/

  • 这不是真的。您必须在系统上安装 ScpVBus 才能使用此 API 进行虚拟游戏手柄交互。只要看看这个[发行说明](https://github.com/shauleiz/vXboxInterface/releases/tag/v1.0.0)。 (3认同)