c++ - DirectInput 控制台应用程序
问题描述
我在 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
指针:我按照这个建议解决了这个问题。无论如何,HWND
我以这种方式获得的指针似乎不是有效的窗口句柄,因为我收到E_HANDLE
错误,因为我将指定nullptr
为参数。我发现通过调用GetTopWindow指定参数允许不获取无效句柄错误。但是我无法获取设备并且我得到了DIERR_OTHERAPPHASPRIO
错误,这只不过是E_ACCESSDENIED
. 我发现似乎有人使用与处理错误相同的方式来处理该错误DIERR_INPUTLOST
,即在 while 循环中重新获取设备,如UpdateInputState函数中的操纵杆直接输入示例所示。无论如何尝试这个我无法退出该循环,即设备设备一直被拒绝。
那就是说我最终得到了
第二个问题:如何在控制台应用程序或 DLL 中使用 DirectInput API?(Win32)如果是控制台应用程序,我想了解为什么我所做的步骤不起作用,如果是 DLL,我想知道是否有人知道HWND
可以使用哪个指针.
解决方案
Microsoft 提供了一个函数来获取控制台应用程序的窗口以供此类用途。
HWND WINAPI GetConsoleWindow(void);
推荐阅读
- flutter - 如果文本包含主题标签“#”,则更改文本颜色
- php - 我想在php中对数组进行排序
- kubernetes - 在 KUBERNETES 上没有持久性的 REDIS 集群
- nginx - 从暂存环境复制到生产环境时,恢复 Wagtail CMS 媒体文件夹时出现问题
- javascript - 无法在我的项目中创建 Gulp dist 文件夹
- java - 使 substring() 方法忽略某些字符
- python - numpy的转置方法无法将一维行ndarray转换为一列
- javascript - 如何遍历对象并更改数据集中的属性键
- extjs - 使用 ExtWebComponents 我如何创建一个简单的视图?
- regex - 正则表达式匹配 SQL 脚本 SSMS 中的最后一个方括号