如何在窗口中获取“X”按钮的坐标?

时间:2009-05-28 14:23:17

标签: c# .net winforms wndproc

由于某种原因,我需要检测用户何时实际点击了X按钮。到目前为止我所拥有的是:

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == (int)0xa1) //WM_NCLBUTTONDOWN
        {
            Point p = new Point((int)m.LParam);
            p = this.PointToClient(p);
            if (p.X > 680)
            {
                //do what I need to do...
            }
        }

        base.WndProc(ref m);
    }

基本上,我注意“WM_NCLBUTTONDOWN”消息,即窗口的非客户区域上的鼠标单击。然后,我从LParam获取X和Y坐标,最后我将其转换为屏幕坐标。所以在这一点上,我知道用户点击了非客户区域,我知道表格上的位置。

我的问题是,如何判断这些坐标是否在X按钮上。现在,我正在硬编码680,因为这是在窗口的当前大小(它不是很大)的工作原理,但问题是我使用的Windows 7具有比XP更大的X按钮,所以显然硬编码是不可行的选项。此外,我甚至没有编码Y坐标,所以如果有人点击窗口的右边缘,那也会触发该代码。那么......任何人都有任何想法吗?

2 个答案:

答案 0 :(得分:3)

假设你有一个OK和一个Cancel按钮,为什么不在单击其中一个按钮时设置一个值。然后在窗体的Closing事件中,如果未设置此值,则表示已单击X按钮。除非有其他方法可以关闭表格,我不知道......

编辑:

您可以在按钮单击时更改窗体的DialogResult属性,而不是使用全局布尔值。当你点击X按钮时我不确定DialogResult的值是什么,你必须尝试它。

答案 1 :(得分:0)

如果您测试WM_NCHITTEST消息,该消息应该告诉您鼠标何时悬停在关闭按钮上。