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或这样的设置。
如果有人对发生了什么有任何建议,将不胜感激。