首页 > 解决方案 > SDL2-CS GetKeyboardState IntPtr 到字节数组

问题描述

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

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

Array 作为 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#sdl-2

解决方案


谢谢汉斯帕桑特。

无论出于何种原因,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, 0, arraySize);
            isKeyPressed = keys[keycode] == 1;
            return isKeyPressed;
        }

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


推荐阅读