C#Topmost=true-仅限于应用程序

C#Topmost=true-仅限于应用程序,c#,winforms,C#,Winforms,如果有新版本可用,我们的应用程序将显示“更新提示” 此更新提示在应用程序中应该是“最上面的”,但是,如果应用程序最小化或发送到后台,更新提示也应该消失 只是使用 this.TopMost = true; 将覆盖当前正在运行的“任何”应用程序 有没有办法只“覆盖”当前应用程序生成的窗口 期望的: 应用程序在每个窗口顶部显示更新提示,而应用程序位于前台。切换到另一个应用程序也会将更新提示发送到后台 所需:更新提示覆盖当前应用程序的任何窗口: 不需要:更新提示也覆盖外部应用程序: 尽管酒店名称

如果有新版本可用,我们的应用程序将显示“更新提示”

此更新提示在应用程序中应该是“最上面的”,但是,如果应用程序最小化或发送到后台,更新提示也应该消失

只是使用

this.TopMost = true;
将覆盖当前正在运行的“任何”应用程序

有没有办法只“覆盖”当前应用程序生成的窗口


期望的: 应用程序在每个窗口顶部显示更新提示,而应用程序位于前台。切换到另一个应用程序也会将更新提示发送到后台


所需:更新提示覆盖当前应用程序的任何窗口:

不需要:更新提示也覆盖外部应用程序:


尽管酒店名称不同,但最顶层实际上是您的敌人。要使“浮动窗体”保持在主窗体上方,而不会在其他应用程序获得焦点时遮挡它们,请尝试以下方法:

FormX f = new FormX();
f.Show(this);

在本例中,“this”是主窗体实例。这意味着您创建的表单现在由主表单拥有,并将使其浮动在主表单之上。当最小化主窗体时,浮动窗体也将消失。我找到了一种解决方法

需要设置
UpdateHint
owner
,但为了将其保持在每个应用程序窗口的顶部,必须在显示或激活新窗口时更改所有者

在我们的应用程序中,每个
表单
都继承了
拦截器表单
,因此我所要做的就是相应地修改
拦截器表单

将所有者更改为
,除非没有对话框,或者
是对话框本身:

public class InterceptorForm : Form
{
    protected override void OnLoad(EventArgs e)
    {
        ...

        if (this.GetType() != typeof(UpdateHint) && MainWindow.updateHint != null)
        {
            Log.t("Setting owner on update hint during onload: " + this.GetType());
            MainWindow.updateHint.Owner = this;
        }

        base.OnLoad(e);
    }


UpdateHint
现在位于属于我们的应用程序的每个窗口的顶部,但可以被任何其他应用程序覆盖。

确保主窗体是浮动窗体的所有者。Windows 10有一个通知系统用于这类事情。您当前的内容与本文内容重叠:@Christopher该文章与OP问题不同。@LarsTech显式设置所有者完全没有影响……这是您必须自定义编写的特殊属性。谢谢你的例子。如果“目标”是将浮动窗体保持在主窗口的顶部,那么这将起作用。但是,这种方法将允许应用程序的“其他”形式覆盖浮动形式-显然,我不能为多个形式调用
f.Show(this)
。@dognose您真正希望我的人切换到WPF,在WPF中,像这样的问题早已被遗忘。@dognose这只是一个不同的问题。我会重新考虑整个更新浮动表单的概念,只显示一个toast通知或其他东西。老实说,用更新表单来烦扰最终用户只是…烦人。@LarsTech看到我的答案,我找到了一种方法来“轻松”改变所有者来处理这个问题。是的,这应该很烦人,因为人们应该更新。(尤其是那些从不关闭电脑和/或应用程序的用户)
    protected override void OnActivated(EventArgs e)
    {
        if (this.GetType() != typeof(UpdateHint) && MainWindow.updateHint != null)
        {
            Log.t("Setting owner on update hint: " + this.GetType());
            MainWindow.updateHint.Owner = this;
        }

        base.OnActivated(e);
    }
}