如何防止 esc 关闭对话框?
我搜索了这个主题,但我找到的都是MFC(您可以覆盖MFC中的PreTranslateMessage函数)。但我的程序是用 Windows API 编写的,不是 MFC。
我尝试捕获对话框过程中的所有键盘消息,但它们都不起作用。我也尝试过在对话框中使用子类化,但它也不起作用。
我怎么能这么做呢? 谢谢。
处理 WM_COMMAND 并检查 IDCANCEL。然后不要将控制传递给默认窗口过程。
您可以很容易地确定它是否来自系统菜单 - 请查看此 MSDN 页面的“返回值”部分以了解如何操作。
如果您无法确定它是来自 ESCAPE 键还是按钮,您始终可以通过为“取消”按钮使用不同的标识符来解决这个问题。
在纯Windows API中,如果您不希望ESC键关闭对话框,而是希望窗口标题关闭按钮(或Alt+F4)关闭它,您可以按如下方式调整代码:
步骤1/2:在WM_COMMAND处理中,不要响应
id==IDCANCEL
情况。
在 Charles Petzold Programming Windows 5th-ed 的经典代码中,他在
EndDialog()
下面调用 id==IDCANCEL
,因此对话框最终关闭。你不能在这里打电话EndDialog()
。
步骤 2/2:在对话框程序中处理
WM_SYSCOMMAND
,如下所示:
case WM_SYSCOMMAND:
{
if(wParam==SC_CLOSE)
{
// Use any value you want to return to DialogBox() caller instead of 4.
EndDialog(hdlg, 4);
return 0;
}
break;
}
WM_SYSCOMMAND
消息由窗口标题关闭按钮和 Alt+F4 触发,但不是由 ESC 键触发,因此它有效。