我有一个使用 Avalonia 编写的应用程序,我想在其中嵌入一个 SLD2 应用程序(SDL2 应用程序是使用 SDL2-CS 包装器用 C# 编写的)。 我使用
NativeControlHost
来获取句柄,如下所示:
public class NativeEmbeddingControl : NativeControlHost
{
public IntPtr Handle { get; private set; }
protected override IPlatformHandle CreateNativeControlCore(IPlatformHandle parent)
{
var handle = base.CreateNativeControlCore(parent);
Handle = handle.Handle;
return handle;
}
}
然后我在创建 SDL2 窗口时使用这个句柄,如下所示:
IntPtr windowPtr = SDL.SDL_CreateWindowFrom(windowHandle);
这对于显示从 SDL2 应用程序渲染的内容来说效果很好。但当我拨打
SDL_KEYDOWN
时,它没有收到 SDL_KEYUP
和 SDL_PollEvent
事件。
如果我将 SDL2 应用程序作为“独立”运行(没有任何嵌入),那么一切都会正常工作。
我还需要执行其他操作才能将按键向上/向下事件传递到嵌入式 SDL2 应用程序吗?
我最终做的是覆盖 Avalonia 应用程序主窗口上的
OnKeyDown
和 OnKeyUp
方法,然后将 Avalonia.Input.Key
枚举映射到 SDL.SDL_Keycode
枚举。之后,我使用给定的向下/向上键创建一个新的 SDL2 事件,如下所示:
public void OnKeyUp(SDL.SDL_Keycode key)
{
SDL.SDL_Event _event = new SDL.SDL_Event();
_event.key.keysym.sym = key;
_event.type = SDL.SDL_EventType.SDL_KEYUP;
SDL.SDL_PushEvent(ref _event);
}
public void OnKeyDown(SDL.SDL_Keycode key)
{
SDL.SDL_Event _event = new SDL.SDL_Event();
_event.type = SDL.SDL_EventType.SDL_KEYDOWN;
_event.key.keysym.sym = key;
SDL.SDL_PushEvent(ref _event);
}
感谢我能够将所有按键上/下事件从 Avalonia 获取到 SDL2 应用程序中。