如何检测窗体/窗口控件框右上角的关闭(X)按钮的单击事件?请注意,我不想知道关于CloseReason,FormClosing,FormClosed或类似的东西,除非它们是不可避免的。我完全是 想要检测用户是否单击了表单的X按钮。感谢。
答案 0 :(得分:7)
如果你真的有充分的理由不使用FormClosing, CloseReason, ...
,你可以覆盖窗口过程并写下这样的内容:
protected override void WndProc(ref Message m)
{
const int WM_NCLBUTTONDOWN = 0x00A1;
const int HTCLOSE = 20;
if (m.Msg == WM_NCLBUTTONDOWN)
{
switch ((int)m.WParam)
{
case HTCLOSE:
Trace.WriteLine("Close Button clicked");
break;
}
}
base.WndProc(ref m);
}
答案 1 :(得分:2)
我知道这是旧线程,但这是一个解决方案。
要使WM_NCLBUTTONUP正常工作,请不要在收到WM_NCLBUTTONDOWN消息时调用基本WndProc:
protected override void WndProc(ref Message m)
{
const int WM_NCLBUTTONDOWN = 0x00A1;
const int WM_NCLBUTTONUP = 0x00A2;
const int HTCLOSE = 20;
if (m.Msg == WM_NCLBUTTONDOWN)
{
switch ((int)m.WParam)
{
case HTCLOSE:
// WndProc Form implementation is buggy :
// to receive WM_NCLBUTTONUP message,
// don't call WndProc.
break;
default:
base.WndProc(ref m);
break;
}
}
else
{
if (m.Msg == WM_NCLBUTTONUP)
{
switch ((int)m.WParam)
{
case HTCLOSE:
Trace.WriteLine("Close Button clicked");
Close(); // Optional
break;
}
}
base.WndProc(ref m);
}
}