当用户在表单外部单击时,如何关闭表单(ShowDialog)?

时间:2012-11-19 21:36:57

标签: .net winforms mouseevent

我有一个Form,它包含一个TreeView。当鼠标在表单之外被阻塞时,我怎么能得到一条消息(所以我可以关闭它)?我尝试过CaptureMouse,但这阻止了鼠标在树内工作。当我在表单外单击时,我没有收到MouseDown消息。

我不能使用WM_NCACTIVATE的WndProc检查,因为我在Excel AddIn中显示了这个,如果点击是在Excel上,Excel会以某种方式阻止发送此消息。

How do I ...中的其他解决方案不起作用。我尝试过并从其他人也尝试过的评论中找到了 - 并且它们不起作用(包括标记为答案的答案)。

谢谢 - 戴夫

1 个答案:

答案 0 :(得分:0)

这只是一个测试示例,因为我没有任何excel插件代码可供使用。

我的想法是使用计时器来检查您的表单控件是否具有焦点。 如果没有焦点,则关闭表格。

首先在表单中声明一个Timer,将其间隔设置为1秒(或更短)并添加此代码

private void timer1_Tick(object sender, EventArgs e)
{
    if (this.Focused == true) return;
    if (AnyFocused(this) == false)
    {
        this.timer1.Stop();
        this.Close();
        // Application.Exit(); -- not recommended but...
    }
}

private bool AnyFocused(Control c)
{
    if (c.Focused == true) return true;
    foreach (Control x in c.Controls)
    {
        if (x.Focused == true) return true;
        if (x.Controls != null && x.Controls.Count > 0)
            return AnyFocused(x);
    }
    return false;
}

我已经使用一个简单的winform应用程序进行了一些测试并且它可以工作,但是你的条件(Excel插件)可能会有很大不同。让我知道。