c - 如何处理父窗口中的所有按键

标签 c winapi

我已经在基本的 UI 问题上苦苦挣扎了一段时间。我有一个父窗口和几个子窗口。对于子窗口,例如按钮(BS_CHECKBOX 样式)和编辑,我无法处理按下 ESC 键事件的任何消息。我可以对子窗口进行子类化,但这似乎只是为了处理一个事件而太过分了。我还有一个 listview child ,由于某种原因我可以正确处理 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;

谢谢

克拉

最佳答案

实现此目的的一种方法是在将其分派(dispatch)到焦点窗口之前在消息循环中捕获它,例如:

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

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

关于c - 如何处理父窗口中的所有按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13622651/

相关文章:

delphi - 如何使用 GDI 按像素强度将位图转换为灰度图?

c# - 如何将 winforms 对话框附加到现有的工具栏/菜单栏(已编译的 C++ 应用程序)?

winapi - GetKeyboardLayout() 在某些情况下无法正常工作

使用 Win32 API 连接字符串

C:接收信号时段错误

c - 如何确定堆栈上的返回地址?

c - 比较数组指针时出现问题

c++ - C丢失指针

c++ - 如何在 OSX 上安装 gtk 以与 g++/gcc 编译器一起使用

c++ - StartServiceCtrlDispatcher 无法访问 1063 错误