Я получаю странное поведение при запуске приложения для 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 или такого набора на них.
Если у кого-нибудь есть какие-либо предложения по поводу того, что происходит, это будет высоко оценено.