首页 > 解决方案 > DirectInput 控制台应用程序

问题描述

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

第一个问题:关于处理力反馈装置的其他方法有什么建议吗?(Win32 应用,不是 UWP)

回到 DirectInput

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

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

现在,一切都很顺利,直到我们遇到SetCooperativeLevel方法,因为它需要一个HWND窗口句柄“与设备关联”并且“必须是属于该进程的有效顶级窗口句柄”作为输入。因为我正在编写一个控制台应用程序,所以我需要找到一个有效的HWND指针:我按照这个建议解决了这个问题。无论如何,HWND我以这种方式获得的指针似乎不是有效的窗口句柄,因为我收到E_HANDLE错误,因为我将指定nullptr为参数。我发现通过调用GetTopWindow指定参数允许不获取无​​效句柄错误。但是我无法获取设备并且我得到了DIERR_OTHERAPPHASPRIO错误,这只不过是E_ACCESSDENIED. 我发现似乎有人使用与处理错误相同的方式来处理该错误DIERR_INPUTLOST,即在 while 循环中重新获取设备,如UpdateInputState函数中的操纵杆直接输入示例所示。无论如何尝试这个我无法退出该循环,即设备设备一直被拒绝。

那就是说我最终得到了

第二个问题:如何在控制台应用程序或 DLL 中使用 DirectInput API?(Win32)如果是控制台应用程序,我想了解为什么我所做的步骤不起作用,如果是 DLL,我想知道是否有人知道HWND可以使用哪个指针.

标签: c++windowsconsole-applicationdirectinput

解决方案


Microsoft 提供了一个函数来获取控制台应用程序的窗口以供此类用途。

HWND WINAPI GetConsoleWindow(void);

推荐阅读