0

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

我不能对 WM_NCACTIVATE 使用 WndProc 检查,因为我是从 Excel 插件内部显示的,并且如果单击在 Excel 上,Excel 会以某种方式阻止发送此消息。

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

谢谢 - 戴夫

4

1 回答 1

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 插件)可能会有很大不同。让我知道。

于 2012-11-19T22:11:21.810 回答