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

标签 c++ windows mfc dialog modal-dialog

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

所以我的问题是,如何防止 only my dialog 在按下 ESC 键后关闭?

最佳答案

Esc 通过 ID 为 IDCANCELWM_COMMAND 自动路由到您的对话框。在 dlgcore.cpp 中,有一个默认处理程序将终止您的对话(以及您的应用程序),如下所示:

void CDialog::OnCancel()
{
    EndDialog(IDCANCEL);
}

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

afx_msg void OnCancelOverride();

在您的对话框消息映射中,为 IDCANCEL 添加路由:

ON_COMMAND(IDCANCEL,OnCancelOverride)

最后添加OnCancelOverride 实现。如果 Esc 关闭,此示例实现不会退出,但允许从系统菜单“关闭”选项退出。

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

  if((GetKeyState(VK_ESCAPE) & 0x8000)==0)
    OnCancel();
}

关于c++ - 如何防止我的基于 MFC 对话框的应用程序在 ESC 键后关闭,但允许其他控件处理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29644317/

相关文章:

c++ - Gstreamer H264 管道滞后

cmath 函数的 C++ 映射

java - 最后一次尝试 SSL/TLS

c++ - 用 C 或 C++ 编写的博客软件

mfc - 想要将 ColeDateTime 转换为 CTime

c++ - 在用户键入 MFC 时验证编辑控件的文本

c++ - EnumWindowsProc() 仅在程序第一次运行时有效

c - 有没有办法禁用cmd中的右键菜单?

c# - 使用 Windows 自动化查找和调用没有祖先的按钮

c++ - 对话框不显示在任务栏中