一旦我们将其作为SDL窗口的父级,wxWindow就不会获得事件

时间:2014-09-04 05:56:30

标签: wxwidgets sdl-2

在我的应用程序中,我有一个使用wxWindow创建的父窗口,并且有一个子窗口,我正在进行渲染,这个窗口是使用SDL 2.0创建的。 因此,一旦我将SDL窗口设置为使用SetParent调用的wxWindow的子节点,所有键盘事件(如按键,键释放等)将转到子窗口而不是父窗口。

以下是虚拟代码:


wxWindow * pParentWindow = new wxWindow();

SDL_Window * pChildWindow = SDL_CreateWindow(" Player",100,100,nWindowWidth,nWindowHeight,SDL_WINDOW_SHOWN);

SDL_SysWMinfo SysInfo; //将保存子窗口信息 SDL_GetWindowWMInfo(pChildWindow,& SysInfo);

HWND SDLHandle = SysInfo.info.win.window;

SetParent(SDLHandle,(HWND)pParentWindow);


在此之后SDL窗口成为wxWindow的子项,现在每当我按任意键时,此事件将仅转到子(SDL)窗口。但是我在父窗口中要求这些事件。

所以任何人都可以告诉我如何在我的父窗口(wxWindow)而不是SDL窗口中获取这些事件,或者将它传播到父窗口。

注意:我使用的是wxWidget 2.8和SDL 2.0。

1 个答案:

答案 0 :(得分:2)

如果所有其他方法都失败了(即你无法让SDL和wxWidgets很好地播放),你可以考虑挂钩键盘。

/**

 Callback for low level keyboard hook

*/
LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
     PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);

// If key is being pressed
if (wParam == WM_KEYDOWN) {
    switch(p->vkCode) {
       ...
    }

}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}




// Set windows hook

HHOOK keyboardHook = SetWindowsHookEx(
    WH_KEYBOARD_LL,
    keyboardHookProc,
    GetModuleHandle (0),  
    //hInstance,
    0);
if( ! keyboardHook ) {
    printf("Keyboard hook failed\n");
}