正在检测winforms中窗口的X按钮单击
本文关键字:按钮 单击 窗口 检测 winforms | 更新日期: 2023-09-27 18:25:58
如何检测窗体/窗口控制框右上角的关闭(X)按钮的点击事件?请注意,我不想知道CloseReason、FormClosing、FormClosed或类似的东西,除非它们是不可避免的。我确实想检测用户是否点击了表单的X按钮。谢谢。
如果真的有充分的理由不使用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);
}
详细信息可以在这里和这里找到。
我知道这是旧线程,但这里有一个解决方案。
要使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);
}
}