如何防止esc关闭对话框?我搜索了这个主题,但我找到的都是MFC(您可以在MFC中覆盖PreTranslateMessage函数)。但我的程序是用Windows API编写的,而不是MFC。我试着在对话框过程中捕捉所有键盘消息,但是没有一个起作用。我也试着在对话框中使用子类化,但是它也不起作用。我怎么能这么做?谢谢。
rxztt3cl1#
处理WM_COMMAND并检查IDCANCEL。然后不将控制传递给默认窗口过程。
bfhwhh0e2#
您可以很容易地确定它是否来自系统菜单--查看this MSDN page的“return value”部分了解如何实现。如果您无法确定它是来自ESCAPE键还是按钮,您可以通过为“取消”按钮使用不同的标识符来解决这个问题。
eiee3dmh3#
在纯Windows API中,如果您不希望ESC键关闭对话框,但希望窗口标题的“关闭”按钮(或Alt+F4)关闭它,则可以按如下方式调整代码:步骤1/2:在WM_COMMAND处理中,不响应id==IDCANCEL case。在Charles Petzold Programming Windows 5th-ed 的经典代码中,他在id==IDCANCEL下面调用EndDialog(),因此对话框最终关闭。在这里不能调用EndDialog()。步骤2/2:在对话框过程中处理WM_SYSCOMMAND,如下所示:
id==IDCANCEL
EndDialog()
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; } }
WM_SYSCOMMAND消息是由窗口标题关闭按钮和Alt+F4触发,而不是由ESC键触发,因此它可以工作。
3条答案
按热度按时间rxztt3cl1#
处理WM_COMMAND并检查IDCANCEL。然后不将控制传递给默认窗口过程。
bfhwhh0e2#
您可以很容易地确定它是否来自系统菜单--查看this MSDN page的“return value”部分了解如何实现。
如果您无法确定它是来自ESCAPE键还是按钮,您可以通过为“取消”按钮使用不同的标识符来解决这个问题。
eiee3dmh3#
在纯Windows API中,如果您不希望ESC键关闭对话框,但希望窗口标题的“关闭”按钮(或Alt+F4)关闭它,则可以按如下方式调整代码:
步骤1/2:在WM_COMMAND处理中,不响应
id==IDCANCEL
case。在Charles Petzold Programming Windows 5th-ed 的经典代码中,他在
id==IDCANCEL
下面调用EndDialog()
,因此对话框最终关闭。在这里不能调用EndDialog()
。步骤2/2:在对话框过程中处理
WM_SYSCOMMAND
,如下所示:WM_SYSCOMMAND
消息是由窗口标题关闭按钮和Alt+F4触发,而不是由ESC键触发,因此它可以工作。