SDL2 的 NativeControlHost 不捕获按键

问题描述 投票:0回答:1

我有一个使用 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 应用程序吗?

c# sdl-2 avaloniaui avalonia
1个回答
0
投票

我最终做的是覆盖 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 应用程序中。

© www.soinside.com 2019 - 2024. All rights reserved.