直接输入控制台应用程序

DirectInput console application

本文关键字:应用程序 控制台 输入      更新时间:2023-10-16

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

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

回到直接输入

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

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

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

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

  • 为调用SetDataFormat的选定设备设置数据格式,以便能够获取设备;

  • 为再次调用SetCooperativeLevel的设备设置合作级别,以便获取设备;

  • 使用设备...

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

也就是说,我最终得到了

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

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

HWND WINAPI GetConsoleWindow(void);