2

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

我想隐藏一个特定的窗口以防应用程序失去焦点(当活动窗口不是应用程序窗口时)

我正在处理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 的情况下获得它?

4

2 回答 2

3

从我可以看到 GetActiveWindow 获取调用线程的活动窗口,即您的应用程序,因此它总是会返回您应用程序的当前窗口。我想也许您正在寻找 GetForegroundWindow 它将句柄返回到用户当前处于活动状态的窗口。

于 2010-03-25T16:26:00.840 回答
0

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

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

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

于 2010-03-25T16:27:24.867 回答