【问题标题】:Get receive keyboard an mouse events from SDL2 in WPF application在 WPF 应用程序中从 SDL2 接收键盘和鼠标事件
【发布时间】:2016-02-01 12:49:37
【问题描述】:

我正在尝试使用 SDL2-CS 绑定库从 SDL2 捕获鼠标和键盘事件。对事件进行轮询,但从未引发这些事件。

我认为这是因为轮询需要在 UI 线程上进行。我尝试通过调用App.Current.Dispatcher.Invoke(Init) 从 UI 线程初始化 SDL,但没有轮询任何事件。

我的类的基本实现:

public override void Initialize()
{
    if (hooked)
    {
        return;
    }

    App.Current.Dispatcher.Invoke(Init); //Run on the UI thread        
}

private void Init()
{
    var init = SDL.SDL_Init(SDL.SDL_INIT_VIDEO);
    if (init != 0)
    {
        throw new Exception("Could not initialize SDL");
    }
    hooked = true;
    ListenForEvents();

}

private void ListenForEvents()
{
    SDL.SDL_Event ev;
    while (true)
    {
        if (SDL.SDL_PollEvent(out ev) != 1) //This is continuously trigged
        {
            continue;
        }

        switch (ev.type) //This is never reached
        {
            case SDL.SDL_EventType.SDL_MOUSEMOTION:
                if (MouseMoved != null) { MouseMoved(this, ev.motion); }
                break;

            ...
        }
    }
}

我想知道我在 UI 线程上调用 Init 是否错误,或者 SDL 初始化是否错误。

附:不希望与 user32.dll 挂钩,因为此代码也将在非 Windows 环境中运行。

【问题讨论】:

  • 看起来没有窗口就无法做到这一点。我需要所有的事件,即使是窗外的事件。我尝试将 SdL_VIDEODRIVER 设置为虚拟,这会隐藏窗口。但随后不再收到任何事件。

标签: wpf multithreading sdl sdl-2


【解决方案1】:

查看您的代码,我会说您的 UI 已被阻止,因为 ListenForEvents 未在其他线程上运行,并且调用 Init 调用将在 UI 线程上运行该方法 - 永远不会返回。

调用 Init 可能是个好主意,但随后您应该启动一个新线程进行轮询。

【讨论】:

  • 我在 UI 线程上尝试了Init,在后台线程上尝试了ListeningForEvents,如下所示:App.Current.Dispatcher.Invoke(Init); Task.Run(() => ListenForEvents()); 但这似乎不起作用。 Initialize 方法不会阻塞。并且循环继续运行,但没有轮询事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
相关资源
最近更新 更多