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