You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:40:29