1.Alt+F4强行退出程序后,在程序中仍然执行Closed事件.所以如果想加处理可以在Closed方法中加.
2.在任务管理器中关闭应用程序和平Alt+F4的功能一样.
3.在任务管理器中关闭进程不会执行Closed事件.

  我在“多线程:C#.NET中使用BackgroundWorker在模态对话框中显示进度条”一文中介绍了如何创造一个能实时显示程序处理进度的对话框,为了让该对话框看起来更加逼真,除了要将窗体的的FormBorderStyle属性设为FixedDialog,将MaximizeBox和MinimizeBox设为false,将ControlBox设为false外,还需要屏蔽Alt

很多时候,在winform的设计下,会遇到新建窗体时不需要用到默认的关闭按钮的情况,而是用另外设置关闭
button或其他控件来控制窗体的关闭。

  • F4组合键以防止用户关闭对话框。屏蔽Alt +
    F4的方法有很多,这里列出了一个比较简单而奏效的方法。

    之前我遇到这个问题时,问了很多朋友,都没找到方法,VS的窗体属性里也没那一项,在MSDN里也没有相关的资料。
但后来偶然发现,原来办法是很简单的,只需要在初始化窗体的时候不显示那关闭按钮就可以了。

1. 捕获窗体的KeyDown事件

    具体方法是,加上一句 “ this.ControlBox = false;”。

  给窗体添加KeyDown事件,然后加入下面的代码:

   如下:

1 private void Form2_KeyDown(object sender, KeyEventArgs e)
2 {
3     if (e.KeyCode == Keys.F4 && e.Modifiers == Keys.Alt)
4     {
5         e.Handled = true;
6     }
7 }

    public Form1()
        {
            InitializeComponent();
            this.ControlBox = false;   // 设置不出现关闭按钮
        }

  代码中判断当前用户是否按下了Alt + F4组合键,如果是则执行e.Handled =
true用于指示事件已经被成功执行,从而屏蔽了系统的Alt + F4功能。

   而对最大最小化按钮的显示,则可以在窗体的属性项里设置即可。

2. 改写窗体的Closing事件

   另外,如果需要保留那关闭按钮的显示,但又不起作用,则可以加上几句代码屏蔽掉它,具体代码如下:

  给窗体添加Closing事件,然后加入下面的代码:

        //禁用窗体的关闭按钮
        private const int CP_NOCLOSE_BUTTON = 0x200;
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams myCp = base.CreateParams;
                myCp.ClassStyle = myCp.ClassStyle |
CP_NOCLOSE_BUTTON;
                return myCp;
            }
        }

1 public void Form2_FormClosing(object sender, FormClosingEventArgs e)
2 {
3     e.Cancel = true;
4 }

 

  当窗体被关闭时(用户点击窗体右上角的关闭按钮或通过程序调用窗体的Close()方法)关闭动作会被取消,那么如何才能通过程序来关闭窗体呢?可以在关闭窗体的代码前去掉窗体的Closing事件,如:

下面说一下几个不是只是让关闭按钮隐藏但是可以达到类似效果的方法:
     1.将ControlBox属性设为False。这种方法是让标题栏中的除了标题名以外的其他的全部隐藏,也就是把图标,最小化、最大化和关闭按钮全部隐藏。 
     2.让关闭按钮失效,方法是在事件里面找到FormCloseing事件,编辑该事件,在里面写上一条语句“e.Cancel =
true;”,这样关闭按钮就失效了,按快捷键“Alt+空格+C”也关闭不了,只有用任务管理器关了,或者用一条语句(“Application.Exit();”)关闭该生成的应用程序,用“Alt+F4”也能关闭。 
     3.将FormBoderstyle属性设置为None。这种方法是将整个标题栏去掉了。这样也是用快捷键“Alt+空格+C”关闭不了,只有用任务管理器关了,或者用一条语句(“Application.Exit();”)关闭生成的该应用程序,用“Alt+F4”也能关闭。

1 this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
2 this.Close();

  当然,你也可以选择不关闭窗体而只是隐藏它,这样该窗体不会在内存中被注销。上面两行代码只能在窗体内部运行,如果你想实现在父窗体中通过程序关闭子窗体,可以在子窗体中添加一个public类型的方法,将上面两行代码加入到方法中,然后在父窗体中调用子窗体的这个方法。如:

主窗体:

1 Form2 frm = new Form2();
2 frm.CloseWindow();

子窗体:

 1 private void Form2_FormClosing(object sender, FormClosingEventArgs e)
 2 {
 3     e.Cancel = true;
 4 }
 5 
 6 public void CloseWindow()
 7 {
 8     this.FormClosing -= new FormClosingEventHandler(this.Form2_FormClosing);
 9     this.Close();
10 }

3. 调用COM组建或全局钩子

  这类方法需要借助于第三方的代码来实现,过程稍微复杂一些,不太推荐使用,可考虑在一些比较特殊的场合使用。这里有两个例子可供参考: