You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SDL2中如何获取当前已按下的按键(非事件触发实现方式)

SDL2 无事件回调查询当前按下按键的方法

直接使用SDL内置的键盘状态查询API即可实现,完全不需要依赖事件队列、事件回调机制:

核心实现步骤

  • 调用SDL_GetKeyboardState()获取SDL内部维护的键盘状态快照数组的指针,数组元素非0代表对应按键处于按下状态,0代表释放。
  • 该数组以SDL_Scancode枚举值作为下标,对应物理键盘上的固定按键位置,不受系统键盘布局影响。如果需要匹配用户逻辑键盘布局的按键(比如按输入字符匹配),可以通过SDL_GetScancodeFromKey()将SDL_Keycode转为对应Scancode再查询。
  • 每次读取状态前需要先调用SDL_PumpEvents()更新SDL的内部输入设备状态,保证拿到的是当前最新的按键状态,不需要额外调用SDL_PollEvent/SDL_WaitEvent等事件处理函数。

代码示例

// 更新SDL内部输入状态
SDL_PumpEvents();

// 获取键盘状态数组指针,不需要手动释放该指针
int key_count;
const Uint8 *key_state = SDL_GetKeyboardState(&key_count);

// 单按键查询示例:判断物理键盘W键是否按下
if (key_state[SDL_SCANCODE_W]) {
    // 处理W键按下的逻辑
}

// 遍历所有按键,输出当前全部按下的按键
for (int i = 0; i < key_count; i++) {
    if (key_state[i]) {
        printf("当前按下的按键:%s\n", SDL_GetScancodeName((SDL_Scancode)i));
    }
}

补充说明

  • 不要手动释放SDL_GetKeyboardState()返回的指针,该内存由SDL内部维护,生命周期和SDL的初始化周期绑定。
  • 如果需要同时查询鼠标按键的按下状态,可使用对应APISDL_GetMouseState(),用法类似,返回值的位掩码对应各个鼠标按键的状态。

内容的提问来源于stack exchange,提问作者UberSuperBoss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:54:07