我无法在.net
中找到一张表格我已检查How to make form always on top in Application,其中的答案提及form1.TopLevel = true;
并且我已经检查过How to make a window always stay on top in .Net?并且说Form.ActiveForm.TopMost
所以我已经尝试Form.ActiveForm.TopMost = true;
this.TopMost = true;
1}}和private void Form1_Load(object sender, EventArgs e)
{
this.TopLevel = true; //default anyway
Form.ActiveForm.TopMost = true;
this.TopMost = true;
}
public Form1()
{
InitializeComponent();
this.TopLevel = true; //default anyway
//Form.ActiveForm.TopMost = true; (commented to prevent a System.InvalidOperationException, presumably the form isn't yet active at this stage)
this.TopMost = true;
}
但是正如您所看到的,记事本窗口或任何窗口都可以覆盖它。
加
到目前为止,我已经尝试了所有建议。
回应Han的建议,"在设置TopMost属性的所有可能位置中,Load事件是最差的。它应该在构造函数中设置,因此窗口最右边会被创建。或者它应该在可见之后设置,因此在Load事件之后。使用构造函数。 &#34 ;.我尝试将这些行放在构造函数中。
this.a
另外两个建议,来自其他人 -
我尝试将设计器中Form的TopMost字段设置为True。
直接运行EXE而不是单击visual studio中的play。
同样的问题。
如果你觉得难以置信,我已经在这里拍摄了1分钟的视频。 https://screencast-o-matic.com/watch/cbXXrw2oTN
提到了一个可能有用的评论..
史蒂夫评论 - "确定在这里发生了奇怪的事情。我尝试使用linqpad创建一个简单的最顶层表单,并在第一次运行时得到相同的行为。在第二次运行时,一切都按预期工作。"
答案 0 :(得分:0)
一个解决方法,就是这个,从Han的观点来看,不要把它放在Load中。负载确实太早了。我一直在发现(至少在有问题的系统上),构造函数也太早了。我发现把它放在Shown事件中是有效的。
一个可能的解决方案就是运行这个补丁,https://support.microsoft.com/en-us/help/2587473/topmost-windows-are-not-always-in-the-topmost-position-in-windows-7-or但是请注意,如果要卸载它,我有一些疑问它是否正确卸载。而且我也不清楚补丁是否正常工作或工作。它可能有用,但我很难说。
一位评论者认为这只是我的系统,尽管事实并非如此,因为史蒂夫第一次遇到同样的问题时遇到了同样的问题。我发现在Windows重启后最容易发生,因此,程序运行得非常新鲜。但是我发现将该代码放在Shown事件中很好,表单仍然保持最佳状态。
我尝试使用SetWindowPos代替TopMost = true,将窗口设置在顶部,我在构造函数中很早就尝试过,而且很晚,就像在Shown事件中或按下按钮一样,我发现它是在显示的事件或点击按钮时很好。因此,问题与TopMost = true行或SetWindowPos行相关,在设置出现的窗口之前过早发生。
稍后调用SetWindowPos时,可以使用this.Handle或GetForegroundWindow(),前者更容易,因为它是原生的。在早先调用它时必须使用this.Handle。并使用this.TopMost = true完全避免所有winAPI调用。
所以简而言之,您可以尝试修补程序,但请注意它可能无法正确卸载..或者您可以尝试在表单的Shown事件中放置this.TopMost = true的解决方法。