【问题标题】:How do I create a virtual gamepad?如何创建虚拟游戏手柄?
【发布时间】:2012-07-27 13:22:18
【问题描述】:

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

【问题讨论】:

    标签: windows virtual gamecontroller


    【解决方案1】:

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

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

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

    这就是真实设备的工作方式。假冒设备需要符合顶层接口要求,例如磁盘、控制器、鼠标或任何东西。然而,在底层他们可以做任何他们喜欢的事情——返回他们喜欢的任何值。

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

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

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

    最后,并不是说您不能过滤现有的 IO,而是通过新设备将其全部完成。有很多选择和方法可以做到这一点。

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

    • VirtualKD 或昂贵的调试器电缆和两台 PC。
    • 您可能还想从this blog post 上的参考资料开始。您会发现驱动程序代码基本上有无数种不同的名称,所以我将解释其中的一些:

      • WDM = Windows 驱动程序模型,基本上是与(某些)Windows 9x 混合的 NT 驱动程序模型。
      • KMDF = 内核模式驱动程序框架 - 上述类型的驱动程序使用它,另外加上 WDF(Windows 驱动程序基础),它是 WDM 之上的一组库,以使其更快使用。
      • UMDF = 用户模式驱动程序框架 - 编写一个没有内核模式危险的驱动程序。如果可以,请使用它,因为出错的内核模式驱动程序将蓝屏(用驱动程序的说法,即错误检查)您的系统。

    编辑:我对 DirectInput 的了解并不多 - 可能有一种方法可以通过 DLL 重定向等覆盖正在使用的各种 API 控件,这可能比我的方法更简单已经描述过了。

    【讨论】:

    • 感谢驱动程序开发的介绍!我的实际意图是修复 360 控制器的 DirectInput 支持。目前,您可以将其与 DI 一起使用,但有限制;不能单独处理触发器,不能将触发器用作按钮(因此它不适用于任何需要四个肩部按钮的东西),并且没有 vibr[...]
    • [...] 化。您的编辑是我的初衷;但是 DI 不使用传统的链接函数,而是仅链接 DirectInputCreate,它返回一个带有函数指针的结构,而且它似乎也为 C 和 C++ 提供了不同的接口。这让我放弃了那条路线,但假司机看起来更难,所以我想我会再试一次。 (在有人建议 XBCD 之前,它破坏了原生 xinput 支持。)
    【解决方案2】:

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

    【讨论】:

    • 另外,您选择的语言中可能有 vJoy 的绑定——例如github.com/tidzo/pyvjoy 用于 Python,我没用过,但很期待。
    【解决方案3】:

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

    【讨论】:

    • 这不是真的。您必须在您的系统上安装 ScpVBus 才能使用此 API 进行虚拟游戏手柄交互。看看这个release note
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      为此使用 C# 启动项目,或者简单地将两个 .dll-s 添加到现有项目作为 x86 或 x64 文件夹中的引用。 您可以在 readme.odt 文件中找到有关如何使用 api 的说明。

      【讨论】:

        猜你喜欢
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多