直接输入控制台应用程序
DirectInput console application
我在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);
- C++控制台应用程序阻止退出
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- 如何在 Win32 C++控制台应用程序中调用 UWP 类库
- 是否可以从控制台应用程序使用 C++/WinRT 创建窗口?
- 如何创建一个使用开源c项目的c++控制台应用程序
- c ++控制台应用程序,如何在控制台外部打印字符
- 像 CPP 中的控制台一样的应用程序
- 调试控制台 ChessEngine.exe "used"在另一个应用程序(国际象棋 GUI)中
- 将控制台应用程序直接输出到Visual Studio而不是外部Windows控制台中
- 如何在 Win32 控制台应用程序中注册不可见的窗口类?
- 如何将从控制台应用程序C++回调设置为C++ COM DLL
- 使用代码在 AWS 开发工具包C++控制台应用程序上设置凭证
- 直接输入控制台应用程序
- C++调试控制台应用程序
- C++控制台应用程序调用C++/CLI静态库
- 如何在控制台应用程序中添加滚动功能以显示更大的输入
- C++应用程序控制台未退出
- 如何使用VSCode调试C++应用程序控制台应用程序
- 用于调试消息的跨平台GUI应用程序控制台
- 自定义应用程序控制台和stderr