【问题标题】:DirectInput console applicationDirectInput 控制台应用程序
【发布时间】: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


【解决方案1】:

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

HWND WINAPI GetConsoleWindow(void);

【讨论】:

    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2011-04-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多