2016-02-01 46 views
0

我試圖使用SDL2-CS綁定庫從SDL2捕獲鼠標和鍵盤事件。事件被調查,但這些事件從未被提出。在WPF應用程序中從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; 

      ... 
     } 
    } 
} 

我wondring如果我在UI線程錯誤調用Init,或者如果SDL初始化是錯誤的。

P.S.掛鉤user32.dll是不希望的,因爲此代碼也會在非Windows環境中運行。

+0

看起來這不能沒有窗口。我需要所有的事件,甚至是窗外的事件。我試着將SdL_VIDEODRIVER設置爲dummy,這隱藏了窗口。但是沒有收到更多的活動。 – Waaghals

回答

0

看着你的代碼,我會說你的UI被阻塞,因爲ListenForEvents不在另一個線程上運行,並且調用Init調用將在UI線程上運行該方法 - 永遠不會返回 - 。

調用Init調用可能是一個好主意,但是您應該啓動一個新的線程進行輪詢。

+0

我已經嘗試過在後臺線程上的UI線程和'ListeningForEvents'的'Init',如下所示:App.Current.Dispatcher.Invoke(Init); Task.Run(()=> ListenForEvents()); '但這似乎並不奏效。 'Initialize'方法不會阻塞。並且循環繼續運行,但沒有事件被輪詢。 – Waaghals

相關問題