0

我正在尝试将 XInput API 用于我的游戏引擎(我正在使用 DirectX11 和 C++)。我只想测试是否找到了控制器,所以我#included 并调用 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 ");
    }

如果我连接控制器,程序会挂起并冻结,而如果我断开控制器,游戏就会启动。如果我使用调试器进入代码,结果是找到了控制器并显示了消息框。为什么?

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

4

1 回答 1

0

当您检查上次调用时未连接的控制器时,性能会受到影响,因为它必须枚举设备、打开驱动程序连接等。因此,建议您进行循环调用以检查新控制器。如果你回来了,你不应该在一段时间内再次ERROR_DEVICE_NOT_CONNECTED调用那个位置。XInputGetState有关这方面的示例,请参阅Directx Tool Ki中的GamePad类和函数。ThrottleRetry

换句话说,除非XUSER_MAX_COUNT实际连接了控制器,否则您之前编写的循环并不是调用每一帧的好主意。

于 2018-08-21T07:06:42.760 回答