我似乎无法找到有效的解决方案来阻止基于对话框的 MFC 应用程序在用户按下键盘上的 ESC 键后关闭。我一直在寻找人们简单地覆盖 PreTranslateMessage
通知并阻止所有 VK_ESCAPE
的 WM_KEYDOWN
消息的代码,但这对我不起作用,因为这种方法阻止应用程序中的所有 ESC 击键。因此,例如,当用户打开一个下拉列表并想用 ESC 键关闭它时,它也会被阻止。或者,如果有人打开弹出菜单或日期时间/日历控件并尝试使用 ESC 击键等将其关闭,也会发生同样的情况。
所以我的问题是,如何防止 only my dialog 在按下 ESC 键后关闭?
最佳答案
Esc
通过 ID 为 IDCANCEL
的 WM_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/