You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:42:46