如何防止我的基于MFC对话框的应用程序在ESC键后关闭,但允许其他控件处理它?

c00*_*0fd 4 c++ windows mfc dialog modal-dialog

我似乎无法找到一个有效的解决方案,当用户在键盘上点击ESC后,如何阻止基于对话框的MFC应用程序关闭.我一直在寻找代码,人们只是覆盖PreTranslateMessage通知并阻止所有WM_KEYDOWN消息VK_ESCAPE,但这对我不起作用,因为这种方法会阻止应用程序中的所有 ESC按键.因此,例如,当用户打开下拉列表并想要使用ESC键关闭它时,它也将被阻止.或者,如果某人打开弹出菜单或日期时间/日历控件并尝试使用ESC键击等来解除它,也会发生同样的情况.

所以我的问题是,如何防止ESC键击后我的对话框关闭?

And*_*own 7

Esc通过WM_COMMANDID 自动路由到您的对话框IDCANCEL.在dlgcore.cpp一个默认的处理程序将终止你的对话框(因此你的情况下的应用程序),如下所示:

void CDialog::OnCancel()
{
    EndDialog(IDCANCEL);
}
Run Code Online (Sandbox Code Playgroud)

要阻止这种情况发生,只需IDCANCEL自己添加一个处理程序.例如,在对话框标题中添加方法签名:

afx_msg void OnCancelOverride();
Run Code Online (Sandbox Code Playgroud)

在对话框消息映射中,为IDCANCEL以下内容添加路由:

ON_COMMAND(IDCANCEL,OnCancelOverride)
Run Code Online (Sandbox Code Playgroud)

最后添加OnCancelOverride实现.如果Esc已关闭但此示例实现不会退出但允许退出系统菜单"关闭"选项.

void CMyDlg::OnCancelOverride() 
{
  // call base implementation if escape is not down

  if((GetKeyState(VK_ESCAPE) & 0x8000)==0)
    OnCancel();
}
Run Code Online (Sandbox Code Playgroud)