按钮,COMBO BOX和KEYBOARD KEYS相互阻挡(winapi)

时间:2010-11-06 19:38:08

标签: c++ winapi

在我的界面中,我有几个按钮,一个组合框和一个显示图像序列的窗口。这些按钮在序列中导航,但我还想浏览键盘上的左箭头和右箭头。编译后键盘键工作正常,因为Focus设置在主窗口,但单击按钮或组合后键盘键不起作用。我在主循环中使用SetFocus(main_hwnd)管理它,但单击时组合框不会响应。

以下示例:

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;
} 

假设这个例子: 编译后,SPACE KEY将起作用,但点击组合框后,它将无法工作。如果我使用SetFocus(hwnd),SPACE KEY将始终有效,但组合框将被禁用。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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);
}