views:

243

answers:

3

Hi, I want that the form will not close by doing Alt+F4 but if Application.Exit() or this.Close is called from the same Form, it should be closed.

I tried CloseReason.UserClosing but still no help.

A: 

Capture Alt+F4 hotkey by setting Form's KeyPreview property to true and overriding OnProcessCmdKey method.

Axarydax
A: 

How did you use CloseReason?

See the sample code here: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosing.aspx

You need to set the Cancel property of the passed FormClosingEventArgs object to stop the form closing.

Adrian
The problem with `FormClosing` event is that Alt+F4 and calling `this.Close()` won't be distinguishable -- they both will have `CloseReason.UserClosing`.
Regent
prior to calling this.Close() set a property that can be examined in FormClosing...
Adrian
@Adrian: this will work it you can actually control where to call form's `Close` method. What if it could be called by some third-party component at some moment?.. Also, `CloseReason.UserClosing` will be set when clicking form's close box. (It is desired behaviour?)
Regent
+2  A: 

If you need to filter out Alt+F4 event only (leaving clicking of close box, this.Close() and Application.Exit() to behave as usual) then I can suggest the following:

  1. Set form's KeyPreview property to true;
  2. Wire up form's FormClosing and KeyDown events:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (_altF4Pressed)
        {
            if (e.CloseReason == CloseReason.UserClosing)
                e.Cancel = true;
            _altF4Pressed = false;
        }
    }
    
    
    private bool _altF4Pressed = false;
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Alt && e.KeyCode == Keys.F4)
            _altF4Pressed = true;
    }
    
Regent
This works! Nice.
Nayan
Rahul2047