我在一个对话框中有一个自定义网格控件,我想弹出一个列表框,允许用户从一组预定义的值中进行选择。我无法捕获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?我已经有一个子类化的编辑控件,我在网格控件中成功完成了这项工作。
答案 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。