我正在Windows中使用C ++进行工作,我需要处理带有力反馈的输入设备。我发现一种解决方案可能是使用DirectInput,所以我开始研究它。
第一个问题:对使用力反馈设备的其他方式有何建议? (Win32应用程序,而不是UWP)
回到DirectInput
我想到的参考起点是DirectInput Samples,尤其是FFconst示例,其中根据从简单GUI抓取的值向第一设备轴施加恒定的反馈力。就我而言,我想要实现的是拥有一个简单的控制台应用程序,在该应用程序中,我根据从标准输入中获取的值设置了恒定的力。
根据示例和文档,使用DirectInput API的基本步骤是:
创建直接输入设备 ,调用DirectInput8Create;
查找设备 调用EnumDevices过滤设备并根据您要查找的内容将范围限制为枚举(在我的情况下, m过滤,仅在DI8DEVCLASS_GAMECTRL
设备中查找并将范围限制为DIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK
);
设置数据格式 ,以便能够获取该设备;
为再次调用SetCooperativeLevel的设备设置协作级别 以获取设备;
< / li>使用设备...
现在,一切顺利,直到遇到 SetCooperativeLevel 方法,因为它需要输入HWND
窗口句柄“ ”以与设备关联,并且“必须是属于该进程的有效顶级窗口句柄” 。由于我正在编写控制台应用程序,因此需要找到有效的HWND
指针:我根据this的建议对问题进行了分类。无论如何,我以这种方式获得的HWND
指针似乎不是有效的窗口句柄,因为我遇到了E_HANDLE
错误,因为我将nullptr
指定为参数。我发现通过调用GetTopWindow指定参数不会导致无效的句柄错误。但是,我无法获取设备,但收到DIERR_OTHERAPPHASPRIO
错误,无非是E_ACCESSDENIED
。我found似乎有人用与处理DIERR_INPUTLOST
错误相同的方式来处理该错误,即在Joystick direct input sample中的while循环中重新获取设备,如 UpdateInputState 函数。无论如何尝试,我都无法退出该循环,即设备设备一直被拒绝。
说我结束了
第二个问题:如何在控制台应用程序或DLL内部使用DirectInput API? (Win32)对于控制台应用程序,我想了解为什么我无法完成这些步骤,对于DLL,我想知道是否有人对{{1} }指针。
答案 0 :(得分:0)
Microsoft提供了一种获取控制台应用程序窗口的功能,用于类似这样的用途。
HWND WINAPI GetConsoleWindow(void);