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

时间:2012-02-25 15:57:21

标签: c# vb.net winforms visual-studio

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

2 个答案:

答案 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);
    }

可以找到详细信息herehere

答案 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);
        }
    }