Windows Form finestra della messa in fuori fuoco (e dietro cartella eseguibile)
-
20-09-2019 - |
Domanda
Sono sempre un po 'strano comportamento in fase di start-up di un'applicazione di Windows e si chiese se qualcuno potesse far luce su quanto sta accadendo e come ottenere intorno ad esso.
Il problema è con l'avvio del app - dovrebbe mostrare una schermata iniziale poi un modulo di accesso. Il codice per questo è:
[STAThread]
static void Main()
{
Application.ThreadException += Application_ThreadException;
MainForm mainForm = null;
Thread splashThread = new Thread(ShowSplash);
try
{
// set up app
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Splash screen
Splash splash = new Splash();
splashThread.Start(splash);
// enable logging
log4net.Config.XmlConfigurator.Configure();
// Create main form
mainForm = new MainForm();
// kill splash
HideForm(splash);
splashThread.Abort();
}
catch (Exception e)
{
splashThread.Abort();
MessageBox.Show(e.Message, "An exception occurred: ", MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(0);
}
// start
Login login = new Login();
login.Show();
if (!mainForm.IsDisposed)
{
Application.Run(mainForm);
}
}
static void ShowSplash(object splash)
{
if (!(splash is Splash))
throw new ArgumentException("Splash screen is of wrong type.");
Splash splashForm = (Splash) splash;
splashForm.ShowDialog();
}
// Thread safe hide form
private delegate void HideFormCallback(Form form);
private static void HideForm(Form form)
{
if (form == null || form.IsDisposed)
return;
if (form.InvokeRequired)
{
HideFormCallback d = HideForm;
form.Invoke(d, new object[] { form });
}
else
{
form.Hide();
}
}
Quindi, stiamo iniziando un nuovo thread con la schermata iniziale, impostare il resto della app nel frattempo, poi uccidere la schermata iniziale poco prima di mostrare il form di login.
Il problema che sto avendo è che il form di login non è attivo quando l'applicazione si avvia. La schermata iniziale si apre e se ne va come previsto. Il modulo di login si apre di fronte a tutte le finestre aperte, ma non è attivo -. La cartella che contiene il file eseguibile (che ho fatto doppio clic per lanciare) ha ancora mettere a fuoco anche quando è dietro il form di login
Se commento fuori tutte le linee a che fare con la schermata iniziale, il modulo di accesso è l'elemento attivo quando viene visualizzato.
La mia ipotesi è che l'attenzione ritorna alla cartella eseguibile quando la schermata iniziale è nascosta, ma io non so perché il form di login non ottiene attenzione quando si lancia.
Calling .Focus () sul login rendimenti forma null quindi non funziona.
Né forma hanno TopMost o tale insieme su di loro.
Se qualcuno ha qualche suggerimento per quello che sta succedendo, sarebbe molto apprezzato.
Soluzione
Questo è quello che ho finito per fare un po 'come una correzione hacky:
void LoginView_Shown(object sender, EventArgs e)
{
SetForegroundWindow(Handle);
this.BringToFront();
Activate();
}
[DllImport("user32")]
public static extern int SetForegroundWindow(IntPtr hwnd);