我将如何创build一个“游戏手柄”,将DirectInput应用程序看作是一个普通的游戏控制器,但其控件的状态实际上是由软件定义的?
具体来说,Windows设备驱动程序通过中断请求协议处理所谓的中断请求 – 这些协议归结为驱动程序内部的一个包装结构和一组缓冲区。
现在接下来你需要知道的是,许多驱动程序实际上是分层的,堆叠的,或者你想使用的名字。 因此,例如要编写一个磁盘驱动程序,您可能会使用它上面的驱动程序(作为磁盘类)进行连接,但使用它下面的驱动程序(例如scsi端口)来实际发送命令到您的设备。
这就是真实的设备的工作原理。 假设备需要符合最高级别的接口要求,例如磁盘,控制器,鼠标等等。 然而,他们可以做任何他们喜欢的事情 – 回报他们喜欢的任何价值观。
这就开辟了通过用户模式应用程序来控制驱动程序并假装成为“设备”的可能性。 要发送驱动程序消息,可以将DeviceIoControl发送给它; 那么要真正得到这些消息,你可以:
把它们塞进构成DeviceIoControl的Irp中。
让驱动程序将它们读出进程的内存空间。
驱动程序还可以访问\Registry\Machine和其他各种非用户特定的非资源管理器注册表区域,因此可以以这种方式进行通信。
最后,没有什么可说的,你不能过滤现有的IO,而不是通过一个新的设备来完成。 有很多选项和方法可以去做这个。
如果你打算这样做,你需要:
VirtualKD或昂贵的调试器电缆和两台PC。
你可能也想从这篇博文的参考文献开始。 你会发现驱动代码基本上有不同的名字,所以我将解释其中的一些:
WDM = Windows驱动程序模型,基本上是与Windows 9x(一些)混合的NT驱动程序模型。
KMDF =内核模式驱动程序框架 – 上述类型的驱动程序使用此功能,另外还有WDF(Windows驱动程序基础),它是WDM之上的一组库,以使其更快速地使用。
UMDF =用户模式的驱动程序框架 – 编写一个驱动程序,没有内核模式的危险。 如果可以的话,使用这个,因为出错的内核模式驱动会蓝屏(用驱动程序的说法,错误检查)你的系统。
编辑 :我没有大量的有关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来与这些虚拟控制器进行交互。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。