我有一个Form,它包含一个TreeView。当鼠标在表单之外被阻塞时,我怎么能得到一条消息(所以我可以关闭它)?我尝试过CaptureMouse,但这阻止了鼠标在树内工作。当我在表单外单击时,我没有收到MouseDown消息。
我不能使用WM_NCACTIVATE的WndProc检查,因为我在Excel AddIn中显示了这个,如果点击是在Excel上,Excel会以某种方式阻止发送此消息。
How do I ...中的其他解决方案不起作用。我尝试过并从其他人也尝试过的评论中找到了 - 并且它们不起作用(包括标记为答案的答案)。
谢谢 - 戴夫
答案 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插件)可能会有很大不同。让我知道。