【发布时间】:2019-01-24 19:13:12
【问题描述】:
我在 Windows 中使用 C++ 工作,我需要处理带有力反馈的输入设备。我发现一种解决方案可能是使用 DirectInput,因此我开始研究它。
第一个问题:关于处理力反馈装置的其他方法有什么建议吗? (Win32 应用,不是 UWP)
回到 DirectInput
我想到的参考起点是DirectInput Samples,特别是FFconst 示例,其中根据从简单GUI 中获取的值将恒定反馈力施加到第一个设备轴。在我的情况下,我想要实现的是拥有一个简单的控制台应用程序,在该应用程序中我根据从标准输入中获取的值设置一个恒定的力。
根据示例和文档,使用 DirectInput API 的基本步骤是:
创建直接输入设备调用DirectInput8Create;
查找设备调用EnumDevices过滤设备并根据您要查找的内容限制枚举范围(在我的情况下,我正在过滤仅查看
DI8DEVCLASS_GAMECTRL设备并将范围限制为DIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK);-
设置数据格式为所选设备调用SetDataFormat,以便能够获取设备;
李> 为设备再次调用SetCooperativeLevel设置合作级别以获取设备;
使用设备...
现在,一切都很顺利,直到我们遇到 SetCooperativeLevel 方法,因为它需要输入一个 HWND 窗口句柄 “与设备关联” 并且 “必须是属于进程的有效顶级窗口句柄”。由于我正在编写一个控制台应用程序,我需要找到一个有效的HWND 指针:我按照this 的建议解决了这个问题。无论如何,我以这种方式得到的 HWND 指针似乎不是一个有效的窗口句柄,因为我得到一个 E_HANDLE 错误,因为我将指定 nullptr 作为参数。我发现通过调用GetTopWindow 指定参数不会导致无效句柄错误。但是我无法获取该设备并且我收到了DIERR_OTHERAPPHASPRIO 错误,只不过是E_ACCESSDENIED。我found 似乎有人用与处理DIERR_INPUTLOST 错误相同的方式来处理该错误,即在while 循环中重新获取设备,如 UpdateInputState 中的Joystick direct input sample 所示em>函数。无论如何尝试这个我无法退出该循环,即设备设备一直被拒绝。
也就是说我最终得到了
第二个问题:如何在控制台应用程序或 DLL 中使用 DirectInput API? (Win32)如果是控制台应用程序,我想了解为什么我所做的步骤不起作用,如果是 DLL,我想知道是否有人知道 HWND 指针可以用。
【问题讨论】:
标签: c++ windows console-application directinput