正在检测winforms中窗口的X按钮单击

本文关键字:按钮 单击 窗口 检测 winforms | 更新日期: 2023-09-27 18:25:58

如何检测窗体/窗口控制框右上角的关闭(X)按钮的点击事件?请注意,我不想知道CloseReason、FormClosing、FormClosed或类似的东西,除非它们是不可避免的。我确实想检测用户是否点击了表单的X按钮。谢谢。

正在检测winforms中窗口的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);
        }
    }