0

出于某种原因,我需要检测用户何时实际单击了 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,它的 X 按钮比 XP 大,所以显然硬编码是不可行的选项。此外,我什至没有为 Y 坐标编码,所以如果有人点击窗口的右边缘,也会触发该代码。所以...有人有什么想法吗?

4

2 回答 2

3

假设您有一个“确定”和一个“取消”按钮,为什么不在单击其中一个按钮时设置一个值。然后在窗体的 Closing 事件中,如果没有设置这个值,就知道 X 按钮被点击了。除非有其他方法可以关闭我不知道的表格...

编辑:

您可以在单击按钮时更改表单的 DialogResult 属性,而不是使用全局布尔值。我不确定单击 X 按钮时的 DialogResult 值是多少,但您必须尝试一下。

于 2009-05-28T14:33:12.333 回答
0

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

于 2009-05-28T14:45:37.647 回答