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

Posted

技术标签:

【中文标题】如何在列表框窗口过程中捕获 VK_ESCAPE【英文标题】:How to trap VK_ESCAPE in a listbox window proc 【发布时间】:2014-01-11 20:59:19 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这样做的方法是在您的控件的窗口过程中实现对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。

【讨论】:

绝对.. 谢谢.. 我也检查了我的编辑控制代码(我之前做过),发现了相同的!

以上是关于如何在列表框窗口过程中捕获 VK_ESCAPE的主要内容,如果未能解决你的问题,请参考以下文章

如何在WIN32 API中“通知”父窗口有关子窗口“列表框”控件的“滚动事件”?

如何捕获图片框中的图像并使其可以在c#应用程序中下载?

如何将文本框中的字符串添加到另一个窗口中的列表视图

pb中如何统一设置数据窗口字体大小

如何获取每个打开窗口的名称列表并将其放入数据框中?

spy++捕获窗口消息