C# 检查winform应用程序是否对其他应用程序失去焦点

C# 检查winform应用程序是否对其他应用程序失去焦点,c#,winforms,show-hide,C#,Winforms,Show Hide,我有一个有很多子表单的应用程序,当我切换到其他应用程序时, 有些表单仍然保留在顶部。我正在使用Form.TopMost属性 我在寻找解决方案,我在这里找到了部分答案: 但这两个都不适合我。 当主窗体对子窗体失去焦点时,也会触发Form.Deactivate事件。 我想检查我的应用程序是否对其他应用程序失去了焦点,这样我就可以隐藏所有子窗体 谢谢 编辑: 多亏了@Hans Passant,我将Form.TopMost切换到ShowOwner。尝试一下WM_ACTIVATEAPP 重写WndProc

我有一个有很多子表单的应用程序,当我切换到其他应用程序时, 有些表单仍然保留在顶部。我正在使用Form.TopMost属性

我在寻找解决方案,我在这里找到了部分答案:

但这两个都不适合我。 当主窗体对子窗体失去焦点时,也会触发Form.Deactivate事件。 我想检查我的应用程序是否对其他应用程序失去了焦点,这样我就可以隐藏所有子窗体

谢谢

编辑: 多亏了@Hans Passant,我将Form.TopMost切换到ShowOwner。

尝试一下WM_ACTIVATEAPP

重写WndProc并检查消息类型和参数。例如,在主窗体中,添加以下代码

protected override void WndProc(ref Message m)
{
    const int WM_ACTIVATEAPP = 0x001C;

    if (m.Msg == WM_ACTIVATEAPP)
    {
        if (m.WParam.ToInt64() == 0) /* Being deactivated */
        {
            /* TODO: */
        }
    }

    base.WndProc(ref m);
}

这对我很有用。

这就是你要找的吗?[这是一个XY问题。最上面的属性被严重滥用,只有在非常罕见的情况下才有必要使用它。请改用自有窗口,Showowner重载来显示它们。@elimad是的,但我试图确定用户是否切换了应用程序,然后隐藏所有表单。@HansPassant,我正在使用最上面的属性来查找表单,我会希望它在用户决定关闭它之前一直处于顶部。这是一个标准的窗口示例,应该是一个拥有的窗口。