SDL2-CS GetKeyboardState IntPtr到字节数组

问题描述

我在项目中使用SDL2,并在使用C#绑定。我正在尝试从GetKeyboardState()函数获取键扫描代码的UInt8 / Byte数组。但是,无论何时尝试,它只会返回0。

我想知道其他人是否也有类似的经历,或者您是否知道我的代码有什么问题?

该数组作为IntPtr返回,因此是不安全的代码。 (我不确定是否应该使用Marshal.copy()函数

 public bool GetKey(SDL.SDL_Keycode _keycode)
        {

            int arraySize;
            bool isKeypressed = false;
            byte keycode = (byte)SDL.SDL_GetScancodeFromKey(_keycode);
            bool found = false;
            unsafe
            {
                var KeyState = (byte*) SDL.SDL_GetKeyboardState(out arraySize);
                for (int i = 0; i < arraySize; ++i)
                {
                    isKeypressed = KeyState[i] == keycode;
                }
            }

            return isKeypressed;
        }

对于不知道SDL2-CS是什么或SDL2是什么,但仍想帮助的人,以下是相关链接

https://github.com/flibitijibibo/SDL2-CS

https://wiki.libsdl.org/

解决方法

感谢汉斯·帕森特。

由于任何原因,C#放入布尔值时都不等于1,所以我不得不将语句扩展一点。

工作代码:

public bool GetKey(SDL.SDL_Keycode _keycode)
        {
            int arraySize;
            bool isKeyPressed = false;
            IntPtr origArray = SDL.SDL_GetKeyboardState(out arraySize);
            byte[] keys = new byte[arraySize];
            byte keycode = (byte) SDL.SDL_GetScancodeFromKey(_keycode);
            Marshal.Copy(origArray,keys,arraySize);
            isKeyPressed = keys[keycode] == 1;
            return isKeyPressed;
        }

为了消除对不安全代码的需求,我使用了Marshal.Copy()函数。