如何在列表框窗口过程中捕获 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的主要内容,如果未能解决你的问题,请参考以下文章