我将如何创建一个"游戏手柄",它似乎将应用程序作为一个普通的游戏控制器直接输入,但其控件的状态实际上是由软件定义的?

有帮助吗?

解决方案

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

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

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

这就是真正的设备的工作原理。假设备需要符合顶级接口要求,例如一个磁盘,一个控制器,一个鼠标,或者不管它是什么。但是,下面他们可以做任何他们喜欢的事情-返回他们喜欢的任何值。

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

  • 将它们塞入组成该DeviceIoControl的Irp中。
  • 让驱动程序从进程的内存空间中读取它们。

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

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

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

  • 虚拟对话 或昂贵的调试器电缆和两台Pc。
  • 你可能也想从下面的参考资料开始 这篇博客文章.你会发现驱动程序代码基本上有很多不同的名称,所以我会解释其中的一些:

    • WDM=Windows驱动程序模型,基本上是与(一些)Windows9x混合的NT驱动程序模型。
    • KMDF=Kernel mode driver framework-上述类型的驱动程序使用它,另外还有WDF(Windows Driver Foundation),这是一组基于WDM的库,可以更快地使用它。
    • UMDF=用户模式驱动程序框架-编写驱动程序没有内核模式的危险。如果可以的话,使用这个,因为内核模式驱动程序出错将蓝屏(在驱动程序的说法,bugcheck)您的系统。

编辑:我对DirectInput的知识并不丰富-可能有一种方法可以通过DLL重定向等复盖正在使用的各种API控件,这可能比我描述的方式更简单。

其他提示

最简单的解决方案可以是模拟XINPUT设备(Xbox 360和一个)。这些都在大多数现代游戏中得到支持,设置非常简单。这是一个C ++项目在这里提供此功能,没有任何已安装的驱动程序或外部依赖项: https://github.com/shauleiz/ vxboxInterface /

有vjoy opensource项目: http://sourceforge.net/projects/vjoystick/ - 可以值得看。

我知道这是一个古老的问题,但对于这个主题感兴趣的人也值得看出这个名为 vigem

您可以模拟一些已知的游戏手柄,如Microsoft Xbox 360控制器,Sony Dualshock 4控制器和Microsoft Xbox One Controller。该项目还提供一些API来与这些虚拟控制器进行交互。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top