繁体   English   中英

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

[英]C# Topmost=true - restrict to application

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

此更新提示应位于应用程序的“最顶层”,但是,如果应用程序最小化或发送到后台,则更新提示也应消失。

只是使用

this.TopMost = true;

将覆盖当前正在运行的“任何”应用程序...

有没有办法只“叠加”当前应用程序生成的窗口?


所需:应用程序在前台时,在每个窗口的顶部显示更新提示。 切换到另一个应用程序还将把更新提示发送到后台。


期望:Update-Hint覆盖当前应用程序的ANY窗口:

在此处输入图片说明

不需要:Update-Hint也可以覆盖FOREIGN应用程序:

在此处输入图片说明

尽管属性名称,TopMost实际上是您在这里的敌人。 要使“浮动表单”停留在主表单之上,而又不会在其他应用程序获得焦点时使其模糊,请尝试这种方式:

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

在此示例中,“ this”是主要表单实例。 这意味着您创建的表单现在由主表单拥有,并将使其浮于其上。 您获得了额外的好处,即当最小化主窗体时,浮动窗体也将消失。

我想出了一种解决方法。

需要设置UpdateHintowner ,但是要使其保持在每个应用程序窗口的顶部,如果显示或激活了一个新的Window,则必须更改所有者。

在我们的应用程序中,每个Form都继承InterceptorForm ,因此我要做的就是相应地修改InterceptorForm

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

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);
    }

    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);
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM