2010-11-06 25 views
0

在我的界面中,我有几个按钮,一个组合框和一个显示图像序列的窗口。这些按钮在序列中导航,但我也想通过键盘上的LEFT和RIGHT箭头导航。编译后键盘按键工作正常,因为焦点设置在主窗口,但点击按钮或组合后,键盘按键不起作用。我在我的主循环中用SetFocus(main_hwnd)来管理它,但是当点击组合框时不会发生反应。下面BUTTONS,COMBO BOX和KEYBOARD KEYS封锁海誓山盟(winapi)

例子:

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 

     case WM_CREATE: 
     CreateWindowEx(0, "COMBOBOX", "", WS_CHILD | WS_VISIBLE | CBS_SORT | CBS_DROPDOWNLIST, 478, 5, 50, 200, hwnd, (HMENU)ID_COMBO1, GetModuleHandle(NULL), NULL); 
     break; 

     case WM_COMMAND: 
     break; 

     case WM_KEYDOWN: 
     switch(wParam) 
     { 
      case VK_SPACE: 
      PostQuitMessage(0); 
      break; 
     } 
     break; 

     case WM_DESTROY: 
      PostQuitMessage (0); 
      break; 

     default: 
      return DefWindowProc (hwnd, message, wParam, lParam); 
    } 
    // SetFocus(hwnd); 
    return 0; 
} 

assumig这个例子: 编译后的空格键将工作,但点击后组合框,它不会工作。如果我使用SetFocus(hwnd)SPACE KEY将始终工作,但组合框将被禁用。

感谢您的帮助。

回答

1

是的,你的窗口过程只针对那个窗口,组合框是一个单独的窗口。我喜欢来处理我的热键消息循环里面,像这样:

MSG msg; 

while (GetMessage(&msg, NULL, 0, 0) > 0) 
{ 
    if (msg.message == WM_KEYDOWN) 
    { 
     if ((UINT)msg.wParam == VK_SPACE) 
     { 
      return 0; // or use postquitmessage 
     } 
    } 

    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 
+0

有许多与此代码的问题:一个微妙的是,你吞下'WM_KEYDOWN'消息,同时控制仍然会收到相应的'WM_KEYUP'信息。但更重要的是,你重新发明了对话管理器,效果不佳:键盘导航应该使用[IsDialogMessage](http://msdn.microsoft.com/en-us/library/ms645498.aspx)和适当的处理'WM_GETDLGCODE'消息。 – IInspectable 2013-01-08 11:08:26

1

他们将键盘消息分派到焦点窗口。这不会是你的主窗口,组合框看到它。这通常由Windows内置的对话框逻辑处理,但您可能没有创建对话框。不知道你想走多远,任何类库都会为你处理这个问题,主要是在分派消息之前,通过对控件进行子分类并在消息循环中寻找导航键。