2009-11-17 47 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);