如何创建虚拟游戏手柄?

时间:2012-07-29 18:46:00

标签: windows virtual gamecontroller

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

5 个答案:

答案 0 :(得分:9)

编写设备驱动程序以伪装成一个。

具体来说,Windows设备驱动程序通过中断请求协议处理所谓的中断请求 - 中断请求协议归结为驱动程序内部的包装结构和一组缓冲区。

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

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

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

  • 将它们装入组成DeviceIoControl的Irp中。
  • 让驱动程序将其从进程的内存空间中读出来。

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

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

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

  • VirtualKD或昂贵的调试电缆和两台电脑。
  • 您可能还想从this blog post上的引用开始。你会发现驱动程序代码基本上有很多不同的名称,所以我会解释其中的一些:

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

编辑:我对DirectInput知之甚少 - 可能有办法通过DLL重定向等覆盖使用的各种API控件,这可能比我的方式更简单我描述过。

答案 1 :(得分:4)

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

我找到的最简单的解决方案是使用 vJoy 及其 C# 包装器。 您需要从这里下载 vJoy 驱动程序。

您可以使用 vJoy SDK 来实现馈送程序:https://github.com/njz3/vJoy/tree/master/SDK/c%23

为此使用 C# 入门项目,或者只需将两个 .dll-s 添加到现有项目中作为来自 x86 或 x64 文件夹的引用。 您可以在 readme.odt 文件中找到有关如何使用 API 的说明。