How to know user has clicked “X” or the “Close” button?

前端 未结 12 993
野性不改
野性不改 2020-11-27 12:19

In MSDN I found CloseReason.UserClosing to know that the user had decided to close the form but I guess it is the same for both clicking the X button or clickin

相关标签:
12条回答
  • 2020-11-27 13:03

    I also had to register the closing function inside the form's "InitializeComponent()" method:

    private void InitializeComponent() {
    // ...
    this.FormClosing += FrmMain_FormClosing;
    // ...
    }
    

    My "FormClosing" function looks similar to the given answer (https://stackoverflow.com/a/2683846/3323790):

    private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) {
        if (e.CloseReason == CloseReason.UserClosing){
            MessageBox.Show("Closed by User", "UserClosing");
        }
    
        if (e.CloseReason == CloseReason.WindowsShutDown){
            MessageBox.Show("Closed by Windows shutdown", "WindowsShutDown");
        }
    }
    

    One more thing to mention: There is also a "FormClosed" function which occurs after "FormClosing". To use this function, register it as shown below:

    this.FormClosed += MainPage_FormClosed;
    
    private void MainPage_FormClosing(object sender, FormClosingEventArgs e)
    {
    // your code after the form is closed
    }
    
    0 讨论(0)
  • 2020-11-27 13:08

    I always use a Form Close method in my applications that catches alt + x from my exit Button, alt + f4 or another form closing event was initiated. All my classes have the class name defined as Private string mstrClsTitle = "grmRexcel" in this case, an Exit method that calls the Form Closing Method and a Form Closing Method. I also have a statement for the Form Closing Method - this.FormClosing = My Form Closing Form Closing method name.

    The code for this:

    namespace Rexcel_II
    {
        public partial class frmRexcel : Form
        {
            private string mstrClsTitle = "frmRexcel";
    
            public frmRexcel()
            {
                InitializeComponent();
    
                this.FormClosing += frmRexcel_FormClosing;
            }
    
            /// <summary>
            /// Handles the Button Exit Event executed by the Exit Button Click
            /// or Alt + x
            /// 
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnExit_Click(object sender, EventArgs e)
            {            
                this.Close();        
            }
    
    
            /// <summary>
            /// Handles the Form Closing event
            /// 
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void frmRexcel_FormClosing(object sender, FormClosingEventArgs e)
            {
    
                // ---- If windows is shutting down, 
                // ---- I don't want to hold up the process
                if (e.CloseReason == CloseReason.WindowsShutDown) return;
                {
    
                    // ---- Ok, Windows is not shutting down so
                    // ---- either btnExit or Alt + x or Alt + f4 has been clicked or
                    // ---- another form closing event was intiated
                    //      *)  Confirm user wants to close the application
                    switch (MessageBox.Show(this, 
                                        "Are you sure you want to close the Application?",
                                        mstrClsTitle + ".frmRexcel_FormClosing",
                                        MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                    {
    
                        // ---- *)  if No keep the application alive 
                        //----  *)  else close the application
                        case DialogResult.No:
                            e.Cancel = true;
                            break;
                        default:
                            break;
                    }
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-27 13:13

    It determines when to close the application if a form is closed (if your application is not attached to a specific form).

        private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (Application.OpenForms.Count == 0) Application.Exit();
        }
    
    0 讨论(0)
  • 2020-11-27 13:15

    The "X" button registers as DialogResult.Cancel so another option is to evaluate the DialogResult.

    If you have multiple buttons on your form, you're probably already associating different DialogResults to each and this will provide you with the means to tell the difference between each button.

    (Example: btnSubmit.DialogResult = DialogResult.OK, btnClose.DialogResult = Dialogresult.Abort)

        public Form1()
        {
            InitializeComponent();
    
            this.FormClosing += Form1_FormClosing;
        }
    
        /// <summary>
        /// Override the Close Form event
        /// Do something
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
        {
            //In case windows is trying to shut down, don't hold the process up
            if (e.CloseReason == CloseReason.WindowsShutDown) return;
    
            if (this.DialogResult == DialogResult.Cancel)
            {
                // Assume that X has been clicked and act accordingly.
                // Confirm user wants to close
                switch (MessageBox.Show(this, "Are you sure?", "Do you still want ... ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                {
                    //Stay on this form
                    case DialogResult.No:
                        e.Cancel = true;
                        break;
                    default:
                        break;
                }
            }
        }
    
    0 讨论(0)
  • 2020-11-27 13:15

    I've done something like this.

    private void Form_FormClosing(object sender, FormClosingEventArgs e)
        {
            if ((sender as Form).ActiveControl is Button)
            {
                //CloseButton
            }
            else
            {
                //The X has been clicked
            }
        }
    
    0 讨论(0)
  • 2020-11-27 13:16
    namespace Test
    {
        public partial class Member : Form
        {
            public Member()
            {
                InitializeComponent();
            }
    
            private bool xClicked = true;
    
            private void btnClose_Click(object sender, EventArgs e)
            {
                xClicked = false;
                Close();
            }
    
            private void Member_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (xClicked)
                {
                    // user click the X
                } 
                else 
                {
                    // user click the close button
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题