Domanda

Sto scrivendo un'applicazione Windows Form in C # .NET

All'avvio, l'applicazione visualizza una schermata iniziale in esecuzione in un thread separato. Mentre viene visualizzata la schermata iniziale, l'applicazione principale viene inizializzata.

Una volta terminata l'inizializzazione dell'applicazione principale, viene visualizzata la forma principale dell'applicazione e la schermata di avvio viene comunque visualizzata in alto.

Tutto finora è come previsto.

Quindi, la schermata Splash viene chiusa, causando la chiusura di quel thread. Per qualche motivo, al momento, le finestre principali dell'applicazione vengono inviate dietro tutte le altre finestre aperte, in particolare la finestra di Windows Explorer in cui hai fatto clic sul file .exe per eseguire l'applicazione in primo luogo!

Che cosa potrebbe causare il salto improvviso di Windows "dietro". come questo?

È stato utile?

Soluzione

Prova a chiamare .Activate () nella finestra principale alla chiusura del thread.

Non è mai stato attivo e quindi ha un basso ordine Z, quindi qualsiasi cosa sia più alta sarà naturalmente al di sopra di essa. Ho dovuto correggere questo scenario esatto nella nostra app.

Non dimenticare! Potrebbe essere necessario eseguire il marshalling della chiamata al thread corretto utilizzando Invoke ()!

Altri suggerimenti

A volte questo è successo. La risposta di Bob è la più semplice e funziona per me nella maggior parte dei casi. Tuttavia, ci sono state alcune volte in cui ho bisogno di usare la forza bruta. Fallo tramite l'interoperabilità in questo modo:

[DllImport (" user32.dll ")] public static extern bool SetForegroundWindow (IntPtr hWnd);

La schermata iniziale è una finestra di dialogo modale?

Ho visto questa finestra "saltare" se si elimina due volte una finestra di dialogo Modale impostando DialogResult e chiamando Hide () o close ().

Codice come questo:

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

Vedi questo post di blog per tutti i casi ...

Puoi usare il codice in questo modo:

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

Grazie a tutti!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top