0

起初这似乎是一个不寻常的问题,但让我解释一下我试图做什么。

我开发了一个程序,它能够连接到名为 PS4 Remote Play 的第 3 方程序。PS4 Remote Play 程序只允许您使用真正的 Dualshock 游戏手柄来控制您的游戏。所以我的程序从 Windows ( kernel32.dll, hid.dll )连接到低级 API以绕过这个限制。我的钩子所做的是,每当为 HID 设备调用CreateFileW时,我的程序都会返回一个自定义虚拟指针,并且随后调用的相应的挂钩hid.dll方法就像这个虚拟指针是 Dualshock 游戏手柄一样。

到目前为止,一切都很好。但是最近我从我的程序的用户那里得到了一些报告,即“模拟”Dualshock 无法正常工作,并且未处理发送到此虚拟 Duashock 的输入。我花了一些时间才弄清楚为什么。每当用户在没有连接 HID 设备的情况下使用笔记本电脑或 PC 时,PS4 远程播放程序从不会调用CreateFileW,至少不会用于创建 HID 句柄。

我不想在我的应用程序中安装虚拟驱动程序,只是为了让 Windows 认为 HID 设备已连接。相反,我尝试挂钩setupapi.dll的功能,只让 PS4 Remote Play 程序认为连接了一个随机虚拟 HID 设备,以便它调用CreateFileW方法。我已经迷上了

  • SetupDiGetClassDevs
  • SetupDiEnumDeviceInfo
  • SetupDiGetDeviceInterfaceDetail

但是我没有使用这个 API 的经验,所以我有几个问题。

即使没有连接 HID 设备, SetupDiGetClassDevs返回的设备信息集是否始终包含 HID 设备的设备信息元素?如果没有,如何为 HID 设备添加假设备信息,或者如何在 C# 中创建假设备信息集并返回它?或者这根本不需要,因为我可以挂钩其他两种方法并在那里做一些事情。

任何建议或提示我如何解决这个问题都会很棒。Windows 没有必要认为 HID 设备已连接,只有第 3 方程序应该像连接到 PC 一样。

4

0 回答 0