Winform区别点击(X)与调用Close方法

517 阅读1分钟

​Winform中调用Close()默认会依次触发FormClosing与FormClosed事件,同样点击(X)按钮时会依次触发FormClosing与FormClosed事件,因此无法准确辨别是点击了(x)按钮还用调用了Close(),通过遍历Windows消息可解决此问题!

using System;
using System.Windows.Forms;

namespace WFormX
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.FormClosing += Form1_FormClosing;
            this.FormClosed += Form1_FormClosed;
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("Form closed");
            return;
        }

        //遍历msg,确定是x掉的,类似MFC
        protected override void WndProc(ref Message m)
        {
            var WM_SYSCOMMAND = 0X112;
            var SC_CLOSE = 0XF060;
            if (m.Msg == WM_SYSCOMMAND && m.WParam == (IntPtr)SC_CLOSE)
            {
                MessageBox.Show("X 被按下了");
                return;
            }
            base.WndProc(ref m);
        }
        
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            MessageBox.Show("Form closing");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

参考:winform 窗口关闭事件 formclosing。