WinForms:如何确定窗口是否不再活动(没有子窗口有焦点)?

时间:2010-03-25 16:20:43

标签: c# winforms winapi user32

我的应用程序使用多个窗口

我想隐藏一个特定的窗口,以防应用程序失去焦点(当活动窗口不是应用程序窗口时)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

如果我的应用程序中的新窗口获得焦点,并且如果我点击其他应用程序,我观察到相同的行为。

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

这怎么可能? Deactivate事件是否“太快”处理? (虽然主要表格仍然有效?)。

如何检测我的应用程序已失去焦点(我的应用程序窗口不是活动窗口),而另一个应用程序在没有在计时器上运行GetActiveWindow的情况下获得它?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

  

当表单失去焦点而不再是活动表单时发生。

但是,事件名称之间的对比(激活 d 与停用)表明事件确实在实际停用之前。