Окно форм Windows запускается не в фокусе (и за исполняемой папкой) - PullRequest
1 голос
/ 17 ноября 2009

Я получаю странное поведение при запуске приложения для Windows и спрашиваю себя, может ли кто-нибудь пролить свет на то, что происходит и как обойти это.

Проблема с запуском приложения - оно должно показывать заставку, а затем форму входа. Код для этого:

    [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();
        }
    }

Итак, мы запускаем новую ветку с заставкой, настраиваем оставшуюся часть приложения, а затем убиваем заставку непосредственно перед отображением формы входа.

Проблема, с которой я столкнулся, заключается в том, что форма входа не имеет фокуса при запуске приложения. Заставка всплывает и уходит, как и ожидалось. Форма входа появляется перед любыми открытыми окнами, но не имеет фокуса - папка, содержащая исполняемый файл (который я дважды щелкнул для запуска), все еще имеет фокус, даже если она находится за формой входа.

Если я закомментирую все строки, относящиеся к экрану-заставке, форма входа будет иметь фокус при появлении.

Мне кажется, что фокус возвращается к исполняемой папке, когда заставка скрыта, но я не знаю, почему форма входа не получает фокус при запуске.

Вызов .Focus () в форме входа возвращает ноль, поэтому не работает.

Ни одна форма не имеет TopMost или такого набора на них.

Если у кого-нибудь есть какие-либо предложения по поводу того, что происходит, это будет высоко оценено.

1 Ответ

4 голосов
/ 17 ноября 2009

Это то, что я в итоге исправил:

    void LoginView_Shown(object sender, EventArgs e)
    {
        SetForegroundWindow(Handle);
        this.BringToFront();
        Activate();           
    }

    [DllImport("user32")]
    public static extern int SetForegroundWindow(IntPtr hwnd); 
...