1
我得到一個Windows應用程序的啓動了一些奇怪的行爲,並想知道如果任何人都可以扔在任何光線發生什麼事,如何解決它。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()返回null,所以不起作用。
這兩種形式都沒有TopMost或這樣的設置。
如果有人對發生了什麼有任何建議,將不勝感激。