2017-11-11 4 views
0

ich nicht eine Form bleiben an der Spitze, in .net bekommenkann nicht Form erhalten oben zu bleiben, in .net

Ich habe überprüft How to make form always on top in Application und die Antwort dort erwähnt form1.TopLevel = true; und ich habe überprüft How to make a window always stay on top in .Net? und es sagt Form.ActiveForm.TopMost so i Form.ActiveForm.TopMost = true; und this.TopMost = true;

private void Form1_Load(object sender, EventArgs e) 
{ 
    this.TopLevel = true; //default anyway 

    Form.ActiveForm.TopMost = true; 
    this.TopMost = true; 
} 

versucht haben, aber wie Sie ein Notizblock Fenster oder jedes Fenster sehen kann, kann es abzudecken.

enter image description here

Added

ich jeden Vorschlag bisher gemacht haben versucht.

Als Antwort auf den Rat von Han: "Von allen möglichen Stellen zum Festlegen der TopMost-Eigenschaft ist das Load-Ereignis am schlechtesten. Es sollte im Konstruktor festgelegt werden, damit das Fenster sofort erstellt wird gesetzt werden, nachdem es sichtbar ist, also nach dem Load-Ereignis. Verwenden Sie den Konstruktor. ". Ich habe versucht, diese Zeilen in den Konstruktor zu setzen.

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

Und die beiden anderen Vorschläge, von andere-

Ich habe versucht, das oberste Feld im Designer auf True des Formulars festlegen.

Und das Ausführen der EXE direkt, anstatt nur im Visual Studio zu klicken.

Gleiches Problem.

Und wenn Sie das kaum glauben, habe ich ein 1min Video hier genommen, das genau das zeigt. https://screencast-o-matic.com/watch/cbXXrw2oTN

Ein potenziell nützlicher Kommentar erwähnt ..

Steve Kommentare -. „OK etwas definitiv hier geschieht Merkwürdiges Ich habe versucht, ein einfaches oberstes Formular erstellen LINQPad verwenden und beim ersten Start ich Ihr gleiches Verhalten erhalten Beim zweiten Lauf funktioniert alles wie erwartet. "

+0

Haben Sie es außerhalb von Visual Studio versucht? (IE läuft die exe) – Steve

+0

wollen Sie Formular als modal öffnen? – crowchirp

+0

Von allen möglichen Orten zum Festlegen der TopMost-Eigenschaft ist das Load-Ereignis am schlimmsten. Es sollte im Konstruktor festgelegt werden, so dass das Fenster sofort oben erstellt wird. Oder es sollte festgelegt werden, nachdem es sichtbar ist, also nach dem Load-Ereignis. Verwenden Sie den Konstruktor. –

Antwort

0

Ein Workaround, ist dies, nach Han Punkt, um es nicht in Load setzen. Die Ladung ist in der Tat zu früh. Ich habe festgestellt, dass (zumindest auf dem System mit dem Problem) der Konstruktor auch zu früh ist. Ich finde, dass es beim Shown-Event funktioniert.

Eine mögliche Lösung ist, diesen Patch auszuführen, https://support.microsoft.com/en-us/help/2587473/topmost-windows-are-not-always-in-the-topmost-position-in-windows-7-or Aber seien Sie gewarnt, wenn Sie es deinstallieren möchten, habe ich einige Zweifel, ob es richtig deinstalliert. Und mir ist auch nicht klar, ob der Patch sporadisch funktioniert oder arbeitet. Es funktioniert wahrscheinlich, aber es ist schwer für mich zu erzählen.

Ein Kommentator dachte, es ist nur mein System, obwohl das nicht der Fall ist, da Steve das gleiche Problem beim ersten Mal lief. Ich finde, dass es nach dem Neustart von Windows am wahrscheinlichsten passieren wird. Das Programm läuft also sehr frisch. Aber ich finde, dass es gut ist, diesen Code in das Shown-Event zu schreiben, und die Form bleibt oben.

Ich habe versucht, anstelle von TopMost = True, mit SetWindowPos, um das Fenster an der Spitze, ich versuchte es ziemlich früh wie im Konstruktor und spät, wie im Shown-Ereignis oder auf einen Knopf klicken, und ich fand es war gut in der Shown Veranstaltung oder auf einen Knopf klicken.Das Problem bezog sich also auf die TopMost = true-Zeile oder die SetWindowPos-Zeile, die zu früh ausgelöst wurde, bevor das Fenster, das eingestellt wurde, angezeigt wurde.

Wenn SetWindowPos später aufgerufen wird, kann entweder this.Handle oder GetForegroundWindow() verwendet werden, ersteres ist einfacher, da es nativ ist. Wenn Sie es früher aufrufen, müssen Sie dies verwenden. Und mit this.TopMost = True vermeidet alle winAPI Anrufe vollständig.

Kurz gesagt, Sie könnten den Patch versuchen, beachten Sie jedoch, dass es möglicherweise nicht richtig deinstalliert .. Oder Sie können versuchen, die Problemumgehung des Puttings this.TopMost = True im Shown-Ereignis des Formulars.

Verwandte Themen