2009-11-17 61 views
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或这样的设置。

如果有人对发生了什么有任何建议,将不胜感激。

回答

3

这是我已经结束了做一个有点哈克修复:

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

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