2010-03-25 91 views
2

我的应用程序使用多个窗口的WinForms:如何确定窗口不再有效(无子窗口具有焦点)?

我想隐藏的情况下,一个特定的窗口的应用程序失去焦点(当活动窗口不是应用程序窗口)source

我处理Deactivate事件我的主要形式。

private void MainForm_Deactivate(object sender, EventArgs e) 
    { 
     Console.WriteLine("deactivate"); 
     if (GetActiveWindow() == this.Handle) 
     { 
     Console.WriteLine("isactive=true"); 
     } 
     else 
     { 
     Console.WriteLine("isactive=false"); 
     } 
    } 

[DllImport("user32.dll")] 
static extern IntPtr GetActiveWindow(); 

输出始终

deactivate 
isactive=true 

,如果我的应用程序中的一个新的窗口接收焦点并且如果我点击进入一个不同的应用程序我观察到相同的行为。

我希望GetActiveWindowDeactivate处理程序调用时返回新的活动窗口的句柄。相反,它总是返回我的应用程序窗口的句柄。

这怎么可能?停用事件是否“过早”处理? (虽然主要形式仍然活跃?)。

我如何检测我的应用程序已失去焦点(我的应用程序窗口不是活动窗口)和其他应用程序获得它没有一个计时器运行GetActiveWindow?

+0

我们是在谈论一个MDI应用程序? – Bobby 2010-03-25 16:27:22

+0

不,这不是一个MDI应用 – Marek 2010-03-25 16:28:52

回答

3

从我所看到的GetActiveWindow get的调用线程,即您的应用程序的活动窗口,因此它总是会返回您的应用程序的当前窗口。我想也许你正在寻找GetForegroundWindow,它会把句柄返回到用户当前激活的窗口。

+0

是,GetForegroundWindow做的。谢谢! – Marek 2010-03-25 16:30:02

+2

好点。请注意,顺便说一句,'GetForegroundWindow'可能在某些情况下返回NULL(例如通过单击任务栏按钮切换焦点)。 – Thomas 2010-03-25 16:30:22

+0

@Thomas,很好的编程实践,即使你不期待它,但很好地突出它(+1),以检查NULL, – Lazarus 2010-03-25 16:54:37

0

我观察相同的行为(.NET 3.5,Visual Studio 2008中)。该文档模糊:

当窗体失去焦点并且不再是活动窗体时发生。

但是,事件名称之间的对比度(激活d与停用)表明事件不实际关闭前已经来了。