我将如何创build一个“游戏手柄”,将DirectInput应用程序看作是一个普通的游戏控制器,但其控件的状态实际上是由软件定义的?
写一个设备驱动程序假装成一个。
具体来说,Windows设备驱动程序通过中断请求协议处理所谓的中断请求 – 这些协议归结为驱动程序内部的一个包装结构和一组缓冲区。
现在接下来你需要知道的是,许多驱动程序实际上是分层的,堆叠的,或者你想使用的名字。 因此,例如要编写一个磁盘驱动程序,您可能会使用它上面的驱动程序(作为磁盘类)进行连接,但使用它下面的驱动程序(例如scsi端口)来实际发送命令到您的设备。
这就是真实的设备的工作原理。 假设备需要符合最高级别的接口要求,例如磁盘,控制器,鼠标等等。 然而,他们可以做任何他们喜欢的事情 – 回报他们喜欢的任何价值观。
这就开辟了通过用户模式应用程序来控制驱动程序并假装成为“设备”的可能性。 要发送驱动程序消息,可以将DeviceIoControl
发送给它; 那么要真正得到这些消息,你可以:
驱动程序还可以访问\\Registry\\Machine
和其他各种非用户特定的非资源管理器注册表区域,因此可以以这种方式进行通信。
最后,没有什么可说的,你不能过滤现有的IO,而不是通过一个新的设备来完成。 有很多选项和方法可以去做这个。
如果你打算这样做,你需要:
你可能也想从这篇博文的参考文献开始。 你会发现驱动代码基本上有不同的名字,所以我将解释其中的一些:
编辑 :我没有大量的有关DirectInput的知识 – 可能有一种方法来覆盖通过DLL重定向等使用的各种API控件,这可能比我所描述的方式更简单。
有vJoy的开源项目: http : //sourceforge.net/projects/vjoystick/ – 值得一看。
最简单的解决方案可能是模拟XInput设备(Xbox 360和One)。 这些在大多数现代游戏中都是支持的,而且安装起来非常简单。 这里是一个C ++项目,它没有提供任何已安装的驱动程序或外部依赖项: https : //github.com/shauleiz/vXboxInterface/
我知道这是一个古老的问题,但对于任何对这个主题感兴趣的人来说,这个名为ViGEm的项目也值得一看。
您可以模拟一些众所周知的游戏手柄,如Microsoft Xbox 360控制器,Sony DualShock 4控制器和Microsoft Xbox One控制器。 该项目还提供了一些API来与这些虚拟控制器进行交互。