如何处理父窗口中的所有按键操作

时间:2012-11-29 09:32:14

标签: c winapi

我已经在基本用户界面上苦苦挣扎了一段时间。我有一个父窗口和几个子窗口。使用按钮(BS_CHECKBOX样式)等子窗口并编辑Im无法处理按ESC键事件的任何消息。我可以子类化子窗口,但它似乎只是处理一个事件的过度杀伤。我也有一个listview孩子,由于某种原因我可以正确处理VK_ESCAPE。我还检查了间谍++,并注意到当按下ESC键(并且孩子被聚焦)时,没有消息被发送到父窗口。如果我将spy ++设置为仅记录子消息,则会为按键生成正确的消息 - 它们不会传递给父节点。有什么想法(不)做什么?

主窗口循环:

  MSG Msg;
  while (GetMessage(&Msg, NULL, 0, 0))
  {
    TranslateMessage (&Msg);
    DispatchMessage (&Msg);
  }

在父级WndProc中处理listview键的工作代码按:

case WM_NOTIFY:
    switch (((LPNMHDR)lParam)->code)
    {
    case LVN_KEYDOWN:
        if (((LPNMLVKEYDOWN)lParam)->wVKey == VK_ESCAPE)
            Exit();
        break;
    }
    break;

谢谢,

克拉

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是在将其分派到焦点窗口之前在消息循环中捕获它,例如:

MSG Msg;
while (GetMessage(&Msg, NULL, 0, 0))
{
    if (Msg.message == WM_KEYDOWN && Msg.wParam == VK_ESCAPE)
    {
        // process escape key
    }
    else
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
}

当然还有其他方法可以做到,但这是一个非常简单的解决方案。