代码之家  ›  专栏  ›  技术社区  ›  dognose

C Topmost=真-仅限于应用程序

  •  -1
  • dognose  · 技术社区  · 7 年前

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

    这个更新提示应该是应用程序中的“最顶层”,但是,如果应用程序最小化或发送到后台,更新提示也应该消失。

    只是使用

    this.topmost=true;
    < /代码> 
    
    

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

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


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


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

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

    .

    只是使用

    this.TopMost = true;
    

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

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


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


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

    enter image description here

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

    2 回复  |  直到 7 年前
        1
  •  4
  •   LarsTech    7 年前

    尽管有房产的名字,最上面的实际上是你在这里的敌人。要使“浮动窗体”保持在主窗体之上,而不会在其他应用程序获得焦点时遮蔽它们,请尝试以下方法:

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

    本例中的“this”是主窗体实例。这意味着您创建的表单现在归主表单所有,并将使其浮动在上面。当最小化主窗体时,浮动窗体也将消失,这是一个额外的好处。

        2
  •  0
  •   dognose    7 年前

    我想出了解决问题的办法。

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

    在我们的应用程序中, Form 是继承 InterceptorForm ,所以我要做的就是修改 拦截器形式 因此:

    将所有者更改为 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);
        }
    }
    

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

    推荐文章