如何在C#中阻止普通用户关闭GUI程序?
拦截窗口常规关闭并添加验证弹窗
核心逻辑
不要尝试移除Closing/FormClosing事件,正确的做法是订阅该事件并在回调中实现验证逻辑:
- 仅拦截用户主动触发的常规关闭(点击窗口叉号、Alt+F4等),不影响程序内部或系统级强制关闭
- 弹出确认弹窗,根据用户选择决定是否允许窗口关闭
WinForms 实现示例
// 构造函数中绑定事件(或通过设计器直接绑定) public YourForm() { InitializeComponent(); this.FormClosing += YourForm_FormClosing; } private void YourForm_FormClosing(object sender, FormClosingEventArgs e) { // 仅处理用户发起的关闭请求 if (e.CloseReason == CloseReason.UserClosing) { var confirmResult = MessageBox.Show("确定要关闭窗口吗?", "确认关闭", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (confirmResult != DialogResult.Yes) { // 取消关闭操作 e.Cancel = true; } } }
WPF 实现示例
// 构造函数中绑定事件(或通过XAML直接绑定) public YourWindow() { InitializeComponent(); this.Closing += YourWindow_Closing; } private void YourWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) { var confirmResult = MessageBox.Show("确定要关闭窗口吗?", "确认关闭", MessageBoxButton.YesNo, MessageBoxImage.Question); if (confirmResult != MessageBoxResult.Yes) { // 取消关闭操作 e.Cancel = true; } }
关于移除Closing事件出错的原因
Closing/FormClosing事件是窗口关闭流程的内置事件,直接移除未订阅的事件会触发空引用错误;即便已订阅,移除事件也无法阻止窗口关闭——它只会让你的代码失去对关闭操作的拦截能力。正确的拦截方式是通过事件参数的Cancel属性控制关闭流程,而非移除事件本身。
内容的提问来源于stack exchange,提问作者Sad_lava
相关产品推荐
相关产品推荐

