我如何创建一个“游戏手柄”,它看起来像DirectInput应用程序作为普通的游戏控制器,但其控件的状态实际上是由软件定义的?
答案 0 :(得分:9)
编写设备驱动程序以伪装成一个。
具体来说,Windows设备驱动程序通过中断请求协议处理所谓的中断请求 - 中断请求协议归结为驱动程序内部的包装结构和一组缓冲区。
现在您需要知道的下一件事是,许多驱动程序实际上是分层或堆叠的,或者您想要使用的任何名称。因此,例如,要编写磁盘驱动程序,您可以与其上方的驱动程序(作为磁盘类)进行交互,但使用其下方的驱动程序(例如scsi端口)来实际向您的设备发送命令。
这就是真实设备的工作原理。假设备需要符合顶级接口要求,例如磁盘,控制器,鼠标或其他任何东西。然而,在他们的下面他们可以做任何他们喜欢的事情 - 返回他们喜欢的任何价值。
这开启了通过用户模式应用程序控制驱动程序并假装“成为”设备的可能性。要发送驱动程序消息,您可以DeviceIoControl
发送消息;然后实际获得这些消息:
驱动程序还可以访问\\Registry\\Machine
和其他各种非用户特定的非资源管理器注册表区域,因此可以通过这种方式进行通信。
最后,没有人说你不能过滤现有的IO,而不是通过一个新的设备来完成。有很多选择和方法可以做到这一点。
如果你打算这样做,你需要:
您可能还想从this blog post上的引用开始。你会发现驱动程序代码基本上有很多不同的名称,所以我会解释其中的一些:
编辑:我对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 的说明。