【发布时间】:2012-07-27 13:22:18
【问题描述】:
我将如何创建一个“游戏手柄”,它在 DirectInput 应用程序中看起来像一个普通的游戏控制器,但它的控制状态实际上是由软件定义的?
【问题讨论】:
标签: windows virtual gamecontroller
我将如何创建一个“游戏手柄”,它在 DirectInput 应用程序中看起来像一个普通的游戏控制器,但它的控制状态实际上是由软件定义的?
【问题讨论】:
标签: windows virtual gamecontroller
编写一个设备驱动程序来伪装成一个。
具体来说,Windows 设备驱动程序通过中断请求协议处理所谓的中断请求 - 归结为驱动程序内部的一个包装结构和一组缓冲区。
接下来您需要知道的是,许多驱动程序实际上是分层的、堆叠的或您想使用的任何名称。因此,例如要编写磁盘驱动程序,您可能会与它上面的驱动程序(作为磁盘类)进行交互,但使用它下面的驱动程序(例如 scsi 端口)来实际向您的设备发送命令。
这就是真实设备的工作方式。假冒设备需要符合顶层接口要求,例如磁盘、控制器、鼠标或任何东西。然而,在底层他们可以做任何他们喜欢的事情——返回他们喜欢的任何值。
这开启了通过用户模式应用程序控制驱动程序并假装“成为”设备的可能性。要发送驱动程序消息,您可以DeviceIoControl 给它;然后要实际获取这些消息,您可以:
驱动程序还可以访问\\Registry\\Machine 和其他各种非用户特定的非资源管理器注册表区域,因此可以通过这种方式进行通信。
最后,并不是说您不能过滤现有的 IO,而是通过新设备将其全部完成。有很多选择和方法可以做到这一点。
如果你要这样做,你需要:
您可能还想从this blog post 上的参考资料开始。您会发现驱动程序代码基本上有无数种不同的名称,所以我将解释其中的一些:
编辑:我对 DirectInput 的了解并不多 - 可能有一种方法可以通过 DLL 重定向等覆盖正在使用的各种 API 控件,这可能比我的方法更简单已经描述过了。
【讨论】:
有 vJoy 开源项目:http://sourceforge.net/projects/vjoystick/ - 值得一看。
【讨论】:
最简单的解决方案可能是模拟 XInput 设备(Xbox 360 和 One)。大多数现代游戏都支持这些,并且设置非常简单。这是一个 C++ 项目,无需安装任何驱动程序或外部依赖项即可提供此功能:https://github.com/shauleiz/vXboxInterface/
【讨论】:
我找到的最简单的解决方案是使用 vJoy 及其 C# 包装器。 您需要从这里下载 vJoy 驱动程序。
您可以使用 vJoy SDK 来实现馈线程序:https://github.com/njz3/vJoy/tree/master/SDK/c%23
为此使用 C# 启动项目,或者简单地将两个 .dll-s 添加到现有项目作为 x86 或 x64 文件夹中的引用。
您可以在 readme.odt 文件中找到有关如何使用 api 的说明。
【讨论】: