0

我一直在为一个基本的用户界面而苦苦挣扎。我有一个父窗口和几个子窗口。对于按钮(BS_CHECKBOX 样式)和编辑等子窗口,我无法处理任何按下 ESC 键事件的消息。我可以对子窗口进行子类化,但仅仅处理一个事件似乎有点过头了。我也有一个 listview 孩子,出于某种原因,我可以正确处理 VK_ESCAPE。我还检查了 spy++ 并注意到当按下 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;

谢谢,

克拉

4

1 回答 1

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

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

于 2012-11-29T09:38:26.803 回答