MFC单对话框程序禁用Esc键后退出码恒为20,如何返回0?
解决MFC对话框禁用Esc/Enter键且设置正确退出码的问题
问题分析
你遇到的退出码始终为20的问题,核心原因是MFC单对话框程序的退出码默认由DoModal()的返回值决定,但当前代码未正确传递和设置这个值;另外还需要补充处理Enter键的默认关闭行为。
解决方案步骤
1. 完善Esc/Enter键的禁用处理
你已通过重写OnBnClickedCancel禁用了Esc键,还需对Enter键做同样处理:
在消息映射中添加IDOK的点击事件映射:
BEGIN_MESSAGE_MAP(CMFCApplication10Dlg, CDialogEx) // ... 原有映射内容 ... ON_BN_CLICKED(IDOK, &CMFCApplication10Dlg::OnBnClickedOk) // 绑定Enter键触发的事件 END_MESSAGE_MAP()
实现OnBnClickedOk方法,不调用基类的OnOK以阻止Enter键关闭对话框:
void CMFCApplication10Dlg::OnBnClickedOk() { // 注释基类调用,禁用Enter键的默认关闭行为 // CDialogEx::OnOK(); }
2. 修正退出码设置
MFC应用程序的退出码由CWinApp的m_nExitCode成员控制,需在程序入口的InitInstance中,将DoModal()的返回值赋值给该成员,确保退出码与EndDialog传入的参数一致:
BOOL CMFCApplication10App::InitInstance() { // ... 原有初始化代码 ... CMFCApplication10Dlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); // 将对话框返回值设置为应用程序退出码 m_nExitCode = static_cast<UINT>(nResponse); // 对话框关闭后退出应用程序 return FALSE; }
3. 保留右上角关闭按钮的正常行为
你当前的OnClose实现正确,调用EndDialog(0)会让DoModal()返回0,结合上述InitInstance的修改,程序退出码将变为0:
void CMFCApplication10Dlg::OnClose() { CDialogEx::EndDialog(0); // 传入0作为退出返回值 }
验证效果
完成修改后:
- 按下Esc或Enter键不会触发对话框关闭
- 点击右上角关闭按钮后,程序退出码将变为0
内容的提问来源于stack exchange,提问作者user20716902
相关产品推荐
相关产品推荐

