c# - 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 是什么但仍想提供帮助的任何人,以下是相关链接:
解决方案
谢谢汉斯帕桑特。
无论出于何种原因,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()
功能。