如果在初始化之前发生按键故障,SDL无法读取移位,解决方法?

时间:2016-08-08 23:00:40

标签: sdl

我在初始化SDL并创建窗口后立即尝试读取shift键的状态,也就是说,我想在启动应用程序时检测是否按下了shift键。

但是虽然我按下Shift键运行app,但它并没有检测到键。

如果我在主循环中添加相同的代码,并且在程序开始运行后我开始按shift ,那么它会正确读取状态,所以我猜SDL内部只识别按下的键如果在SDL运行时发生键down 事件。

可能有一种与操作系统无关的处理方法吗?我顺便使用MacOS,但希望这个项目尽可能与操作系统无关。

// Added either of these but didn't help:
// SDL_PumpEvents();
// SDL_Event event; // while( SDL_PollEvent( &event ));

const Uint8 *keys = SDL_GetKeyboardState(NULL);
if( ! keys[SDL_SCANCODE_LSHIFT] and ! keys[SDL_SCANCODE_RSHIFT] ) {
    printf( "Booted without shift." );
}
else {
    printf( "Booted pressing shift." );
}

1 个答案:

答案 0 :(得分:2)

SDL依靠事件处理来填充键盘状态数组。来自documentation

  

注意:此函数在处理完所有事件后为您提供当前状态,因此如果在处理事件之前按下并释放了按键或按钮,则按下的状态将永远不会显示在SDL_GetKeyboardState()调用中。

这意味着你必须为你想要支持的每个平台实现它,但这不应该太困难:

bool shift_pressed(void)
{
#ifdef WINDOWS
    return GetKeyState(VK_SHIFT) & 0x8000
#else
    // Implement for other OS as needed
    return false;
#endif        
}