Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何创建虚拟游戏板?_Windows_Virtual_Gamecontroller - Fatal编程技术网

Windows 如何创建虚拟游戏板?

Windows 如何创建虚拟游戏板?,windows,virtual,gamecontroller,Windows,Virtual,Gamecontroller,我该如何创建一个“gamepad”,它在DirectInput应用程序中看起来是一个普通的游戏控制器,但其控件的状态实际上是由软件定义的?编写一个设备驱动程序来假装是一个 具体来说,Windows设备驱动程序通过中断请求协议处理所谓的中断请求,该协议归结为一个封装结构和驱动程序内部的一组缓冲区 现在,您需要知道的下一件事是,许多驱动程序实际上是分层的,或者是堆叠的,或者是您想要使用的任何名称。例如,要编写一个磁盘驱动程序,您可以与上面的驱动程序接口(作为磁盘类),但可以使用下面的驱动程序(例如s

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

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

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

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

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

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

  • 将它们填入构成设备控制的Irp中
  • 让驱动程序从进程的内存空间中读取它们
驱动程序还可以访问
\\Registry\\Machine
和其他各种非用户特定的非浏览器注册表区域,因此可以通过这种方式进行通信

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

如果要这样做,您需要:

  • 或者一根昂贵的调试电缆和两台电脑
  • 您可能还希望从上的引用开始。您会发现,驱动程序代码基本上有无数不同的名称,因此我将解释其中的一些:

    • WDM=Windows驱动程序模型,基本上是NT驱动程序模型与(部分)Windows 9x混合
    • KMDF=内核模式驱动程序框架-上述类型的驱动程序使用此框架,另外还使用WDF(Windows驱动程序基础),WDF是WDM之上的一组库,用于加快使用速度
    • UMDF=用户模式驱动程序框架-编写一个没有内核模式危险的驱动程序。如果可以的话,使用它,因为内核模式的驱动程序出错会导致系统出现蓝屏(用驱动程序的说法,是错误检查)

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

有一个vJoy开源项目:-值得一看。

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

我知道这是一个老问题,但是对于任何有兴趣的人来说,也值得看看这个项目。
您可以模拟一些著名的游戏机,如Microsoft Xbox 360控制器、Sony DualShock 4控制器和Microsoft Xbox One控制器。该项目还提供了一些与这些虚拟控制器交互的API。例如,可以找到C#API

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

您可以使用vJoy SDK来实现feeder程序:

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

感谢您对驱动程序开发的介绍!我的实际意图是修复360控制器的DirectInput支持。目前,您可以将其与DI一起使用,但有一些限制;不能单独处理触发器,不能将触发器用作按钮(因此它不适用于任何需要四个肩部按钮的对象),并且没有振动[…][…]。你的编辑是我的初衷;但是DI不使用传统的链接函数,而是只链接指向DIN的PrimPrdCube,它返回一个带有函数指针的结构,并且它似乎也为C和C++提供了不同的接口。这让我偏离了那条路线,但是一个假司机看起来更难,所以我想我会再试一次。(在任何人建议使用XBCD之前,它破坏了本机xinput支持。)这不是真的。您必须在系统上安装ScpVBus,才能将此API用于虚拟gamepad交互。看看这个,另外,在您选择的语言中可能有vJoy的绑定——例如Python,我还没有使用过,但我很期待。