DirectInput控制台应用程序

时间:2018-08-17 17:43:48

标签: c++ windows console-application directinput

我正在Windows中使用C ++进行工作,我需要处理带有力反馈的输入设备。我发现一种解决方案可能是使用DirectInput,所以我开始研究它。

第一个问题:对使用力反馈设备的其他方式有何建议? (Win32应用程序,而不是UWP)

回到DirectInput

我想到的参考起点是DirectInput Samples,尤其是FFconst示例,其中根据从简单GUI抓取的值向第一设备轴施加恒定的反馈力。就我而言,我想要实现的是拥有一个简单的控制台应用程序,在该应用程序中,我根据从标准输入中获取的值设置了恒定的力。

根据示例和文档,使用DirectInput API的基本步骤是:

  • 创建直接输入设备 ,调用DirectInput8Create;

  • 查找设备 调用EnumDevices过滤设备并根据您要查找的内容将范围限制为枚举(在我的情况下, m过滤,仅在DI8DEVCLASS_GAMECTRL设备中查找并将范围限制为DIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK);

  • 为呼叫SetDataFormat的所选设备
  • 设置数据格式 ,以便能够获取该设备;

  • 为再次调用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} }指针。

1 个答案:

答案 0 :(得分:0)

Microsoft提供了一种获取控制台应用程序窗口的功能,用于类似这样的用途。

HWND WINAPI GetConsoleWindow(void);