【问题标题】:How to handle all key presses in a parent window如何处理父窗口中的所有按键
【发布时间】:2012-11-29 09:32:13
【问题描述】:

我一直在为一个基本的 UI 问题苦苦挣扎。我有一个父窗口和几个子窗口。对于按钮(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;

谢谢,

克拉

【问题讨论】:

    标签: c winapi


    【解决方案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);
        }
    }
    

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

    【讨论】:

    • 简单 && 真棒。谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2014-03-20
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多