【发布时间】: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