无法在.net

时间:2017-11-11 15:40:38

标签: c# .net winforms

我无法在.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;
    }

但是正如您所看到的,记事本窗口或任何窗口都可以覆盖它。

enter image description here

到目前为止,我已经尝试了所有建议。

回应Han的建议,"在设置TopMost属性的所有可能位置中,Load事件是最差的。它应该在构造函数中设置,因此窗口最右边会被创建。或者它应该在可见之后设置,因此在Load事件之后。使用构造函数。 &#34 ;.我尝试将这些行放在构造函数中。

this.a

另外两个建议,来自其他人 -

我尝试将设计器中Form的TopMost字段设置为True。

直接运行EXE而不是单击visual studio中的play。

同样的问题。

如果你觉得难以置信,我已经在这里拍摄了1分钟的视频。 https://screencast-o-matic.com/watch/cbXXrw2oTN

提到了一个可能有用的评论..

史蒂夫评论 - "确定在这里发生了奇怪的事情。我尝试使用linqpad创建一个简单的最顶层表单,并在第一次运行时得到相同的行为。在第二次运行时,一切都按预期工作。"

1 个答案:

答案 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的解决方法。