如何在列表框窗口proc中捕获VK_ESCAPE

时间:2014-01-11 20:59:20

标签: c++ winapi user-interface listbox

我在一个对话框中有一个自定义网格控件,我想弹出一个列表框,允许用户从一组预定义的值中进行选择。我无法捕获VK_ESCAPE键,我已经将控件子类化了。我试过WM_KEYDOWN,WM_CHAR,WM_VKEYTOITEM没有成功。我在创建ListBox窗口(CreateWindow)WS_BORDER |时设置了以下样式WS_CHILD | LBS_HASSTRINGS | LBS_NOTIFY | WS_VSCROLL | LBS_WANTKEYBOARDINPUT。当显示列表框并按下esc时,该键将传递给对话框,并在对话框中照常处理,对话框将被取消并关闭。任何想法在哪里/如何在列表框窗口proc中捕获VK_ESCAPE?我已经有一个子类化的编辑控件,我在网格控件中成功完成了这项工作。

1 个答案:

答案 0 :(得分:2)

执行此操作的方法是在控件的窗口过程中实现WM_GETDLGCODE消息的处理(即,您要拦截转义键的控件 - 所以在这种情况下我认为它会是你的弹出列表而不是网格控件。)

只要按下某个键,对话框管理器就会将此消息发送给控件,并且返回值可以影响键的处理方式。

例如:

   case WM_GETDLGCODE:
      if (lParam)
      {
         LPMSG lpmsg = (LPMSG)lParam;
         if (lpmsg->message == WM_KEYDOWN && lpmsg->wParam == VK_ESCAPE)
            return DLGC_WANTMESSAGE;
      }
      return 0;

如果您要将其添加到的控件不是自定义控件,而是是一个系统控件,你需要对它进行子类化以添加这种处理。

Raymond Chen也有blog posting on this topic