C++ 新普盖特州被绞死

C++ 新普盖特州被绞死,c++,directx,xinput,C++,Directx,Xinput,我正在尝试为我的游戏引擎使用xinputapi(我正在使用DirectX11和C++)。我只是想测试是否找到了一个控制器,所以我加入并调用XInputGetState,但我得到了一个奇怪的行为: XINPUT_STATE state; ZeroMemory(&state, sizeof(XINPUT_STATE)); DWORD result; for (DWORD i = 0; i < XUSER_MAX_COUNT; i++) {

我正在尝试为我的游戏引擎使用xinputapi(我正在使用DirectX11和C++)。我只是想测试是否找到了一个控制器,所以我加入并调用XInputGetState,但我得到了一个奇怪的行为:

    XINPUT_STATE state;
    ZeroMemory(&state, sizeof(XINPUT_STATE));

    DWORD result;
    for (DWORD i = 0; i < XUSER_MAX_COUNT; i++)
    {
        result = XInputGetState(i, &state);
        if (result == ERROR_SUCCESS)
            ErrorBox(L"found controller on port ");
    }
XINPUT_状态;
零内存(&state,sizeof(XINPUT_state));
德沃德结果;
对于(DWORD i=0;i
如果我连接了控制器,程序将挂起并冻结,而如果我断开控制器,游戏将启动。如果我使用调试器进入代码,结果是找到控制器并显示消息框。 为什么?


编辑问题似乎出在对ErrorBox的调用中:此函数仅使用Win32 API显示一个消息框

检查上次调用时未连接的控制器时,性能会受到影响,因为它必须枚举设备、打开驱动程序连接等。因此,建议您循环调用以检查新控制器。如果您将
ERROR\u DEVICE\u NOT\u CONNECTED
重新连接,则暂时不应再次为该插槽调用
XInputGetState
。有关此示例,请参见Directx工具Ki中的类和
ThrottleRetry
函数


换句话说,您之前编写的循环不是调用每个帧的好主意,除非实际连接了
XUSER\u MAX\u COUNT
控制器。

是的,但是如果我注释掉Errorbox,它就可以正常工作。如果我使用OutputDebugString,它可以正常工作。那么Win32 API调用有什么问题呢?这个问题类似于应用程序如何处理主窗口消息循环,这里没有显示。有关如何为DirectX执行此操作的示例,请参阅。