我在对话框中有一个自定义网格控件,我想弹出一个列表框以允许用户从一组预定义值中进行选择。我无法捕获 VK_ESCAPE 键,我已经将控件子类化。我试过 WM_KEYDOWN、WM_CHAR、WM_VKEYTOITEM,但都没有成功。我在创建列表框窗口 (CreateWindow) 时设置了以下样式WS_CHILD | LBS_HASSTRINGS | LBS_通知| WS_VSCROLL | LBS_WANTKEYBOARDINPUT。当显示列表框并按下 esc 键时,该键将传递给对话框,并像往常一样由对话框处理,因为对话框被取消并关闭。有什么想法可以在哪里/如何在列表框窗口过程中捕获 VK_ESCAPE 吗?我已经有一个子类编辑控件,我在网格控件中成功地做到了这一点。
最佳答案
做到这一点的方法是实现对 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;
如果您要将其添加到的控件不是自定义控件,而是例如是一个系统控件,您需要对其进行子类化以添加此处理。
陈峰也有一个blog posting on this topic .
关于c++ - 如何在列表框窗口过程中捕获 VK_ESCAPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21067801/