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.

È stato utile?

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); 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top