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();
}
}
}