我似乎找不到有效的解决方案,如何在用户按键盘上的ESC后阻止基于对话框的MFC应用程序关闭。我一直在寻找代码,使人们仅重写PreTranslateMessage
通知并阻止的所有WM_KEYDOWN
消息VK_ESCAPE
,但这对我不起作用,因为这种方法会阻止应用程序中的所有ESC按键。因此,例如,当用户打开一个下拉列表并希望使用ESC键将其关闭时,该列表也会被阻止。或者,如果有人打开弹出菜单或日期时间/日历控件,并尝试使用ESC按键将其关闭,也会发生同样的情况。
所以我的问题是,如何防止仅在ESC按键后对话框关闭?
Esc
会自动通过WM_COMMAND
ID路由到您的对话框IDCANCEL
。在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();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句