2008-10-10 10 views
14

IchAnwendungsfenster hinter anderen Fenstern auf Schließen anderen Thread (C#) gesendet

Beim Start eines Windows Forms-Anwendung in C# .NET zu schreiben, zeigt die Anwendung einen Begrüßungsbildschirm, der in einem separaten Thread ausgeführt wird. Während der Begrüßungsbildschirm angezeigt wird, wird die Hauptanwendung initialisiert.

Sobald die Hauptanwendung die Initialisierung beendet hat, wird die Hauptform der Anwendung angezeigt und der Begrüßungsbildschirm wird immer noch angezeigt.

Alles ist so weit wie erwartet.

Dann wird der Begrüßungsbildschirm geschlossen, wodurch der Thread beendet wird. Aus irgendeinem Grund wird das Hauptanwendungsfenster an diesem Punkt hinter alle anderen geöffneten Windows gesendet, insbesondere das Windows Explorer-Fenster, in dem Sie auf die .exe-Datei geklickt haben, um die Anwendung überhaupt auszuführen!

Was könnte dazu führen, dass die Fenster plötzlich so "zurück" springen?

Antwort

10

Versuchen Sie, .Activate() auf Ihrem Hauptfenster aufzurufen, wenn Ihr Thread geschlossen wird.

Es war nie aktiv und hat daher eine niedrige Z-Ordnung, also was immer höher ist, wird natürlich darüber sein. Ich musste dieses genaue Szenario in unserer App beheben.

Nicht vergessen! Möglicherweise müssen Sie den Aufruf mithilfe von Invoke() an den richtigen Thread leiten.

1

Ich hatte das auch manchmal passieren. Bobs Antwort ist die einfachste und funktioniert in den meisten Fällen für mich. Es gab jedoch Zeiten, in denen ich rohe Gewalt anwenden musste. Führen Sie dies über Interop wie folgt aus:

[DllImport ("user32.dll")] öffentliche statische extern bool SetForegroundWindow (IntPtr hWnd);

0

Ist der Begrüßungsbildschirm ein modaler Dialog?

Ich habe dieses Fenster 'springen' gesehen, wenn Sie einen Modal-Dialog zweimal durch Setzen von DialogResult und Aufruf von Hide() oder close() schließen.

-Code wie folgt aus:

private void button1_Click(object sender, System.EventArgs e) 
{ 
    this.DialogResult = DialogResult.Abort; 
    this.Hide(); 
} 

Siehe this Blog-Eintrag für alle Fälle ...

-2

Sie folgenden Code verwenden können:

private void button1_Click(object sender, System.EventArgs e) 
{ 
    this.DialogResult = DialogResult.Abort; 
    this.Hide(); 
} 

Dank all!

+0

Die Wiederholung eines Code-Snippets über ein Jahr nach der Veröffentlichung ist für einen Leser nicht hilfreich. –

+0

Vor allem, wenn der Code kopiert/eingefügt wird, ist ein Beispiel für Code, der das Problem verursacht. – damian