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

SDL2-CS中GetKeyboardState获取按键状态始终返回0的问题求助

SDL2-CS中GetKeyboardState返回0的问题排查与修复

嘿,我之前也碰到过类似的坑!你这段代码的问题其实出在对SDL_GetKeyboardState返回值的理解上,咱们一步步捋清楚:

你的代码核心错误

你完全搞反了数组索引和元素的含义:
SDL_GetKeyboardState返回的字节数组,索引对应扫描码的数值,而数组里的元素值才是按键的状态——1表示按键按下,0表示松开。你现在是把数组元素和扫描码做对比,这根本不是判断按键是否按下的正确逻辑;而且循环里每次都覆盖isKeyPressed,最后只会检查最后一个数组元素,这肯定得不到正确结果。

修复后的代码

Unsafe代码版本(更高效)

直接用扫描码作为索引去取数组里的状态值就行,不用遍历整个数组:

public bool GetKey(SDL.SDL_Keycode _keycode)
{
    int arraySize;
    var scancode = SDL.SDL_GetScancodeFromKey(_keycode);
    unsafe
    {
        byte* keyState = (byte*)SDL.SDL_GetKeyboardState(out arraySize);
        // 先判断扫描码是否在有效范围内,避免数组越界
        if (scancode >= 0 && scancode < arraySize)
        {
            return keyState[scancode] == 1;
        }
    }
    return false;
}

安全代码版本(无需Unsafe)

如果你不想用unsafe代码,也可以用Marshal.Copy把SDL返回的指针复制到自己的字节数组里再判断:

using System.Runtime.InteropServices;

public bool GetKey(SDL.SDL_Keycode _keycode)
{
    int arraySize;
    IntPtr keyStatePtr = SDL.SDL_GetKeyboardState(out arraySize);
    byte[] keyStateArray = new byte[arraySize];
    Marshal.Copy(keyStatePtr, keyStateArray, 0, arraySize);
    
    var scancode = SDL.SDL_GetScancodeFromKey(_keycode);
    if (scancode >= 0 && scancode < arraySize)
    {
        return keyStateArray[scancode] == 1;
    }
    return false;
}

额外注意事项

  • 一定要确保你在调用这个方法前,已经处理了SDL的事件循环(比如调用SDL_PollEvent或者SDL_WaitEvent),不然SDL可能不会更新键盘状态,导致你拿到的还是旧的、不正确的数值。
  • SDL_GetKeyboardState返回的指针是SDL内部管理的内存,不需要你手动释放;如果不需要长期保存键盘状态,用unsafe版本会更高效,没必要复制数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:12:46