在我的窗口未聚焦/重新聚焦之前,为什么SDL_GameController不报告事件?

问题描述

我仅使用SDL的Input部分,创建自己的Win32窗口,然后从中创建一个SDL窗口。我在使用SDL_GameController接口时遇到了一些问题。由于某种原因,当我的游戏启动时,游戏控制器无法正常工作。发送了SDL_CONTROLLERDEVICEADDED,但此后没有发送任何控制器/操纵杆事件,并且尝试读取控制器的状态始终返回零。

但是,如果我从窗口中单击然后重新进入,则控制器可以工作,并且我无法弄清楚原因。其他输入(键盘/鼠标)似乎工作正常。

相关代码

Win32窗口创建:

    // Removing some irrelevant code
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_ENABLE;
    wcex.lpszClassName  = _T("WndClass");

    RegisterClassEx(&wcex);
    
    /// ....
    HWND hWnd = CreateWindowW(L"WndClass",L"Window",WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU,x,y,rect.right - rect.left,rect.bottom - rect.top,NULL,hInstance,NULL);

    
    ShowWindow(hWnd,nCmdshow);
    UpdateWindow(hWnd);

SDL初始化

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER);
_sdlWindow = SDL_CreateWindowFrom((void*)winInfo->hWnd);

SDL帧

    while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
        case SDL_CONTROLLERDEVICEREMOVED:
            if (_sdlGameController != nullptr)
            {
                SDL_GameController* deadController = SDL_GameControllerFromInstanceID(event.jdevice.which);
                if (deadController == _sdlGameController)
                {
                    SDL_GameControllerClose(_sdlGameController);
                    _sdlGameController = nullptr;
                }
            }
            break;
        case SDL_CONTROLLERDEVICEADDED:
            if (_sdlGameController == nullptr)
            {
                _sdlGameController = SDL_GameControllerOpen(event.jdevice.which);
                SDL_GameControllerEventState(SDL_ENABLE);
            }
            break;
        }
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)