2012-05-10 54 views
3

我創建了一個在系統托盤啓動時啓動的應用程序。我用下面的帖子來實現這一目標: How to start WinForm app minimized to tray?單擊桌面快捷方式時從系統托盤中恢復應用程序

這個應用程序也只允許一個實例來運行: http://www.codeproject.com/Articles/32908/C-Single-Instance-App-With-the-Ability-To-Restore

我得到的問題是,當我第一次啓動它minmizes到系統中的應用托盤,但如果我點擊桌面圖標,它不會出現。我必須點擊托盤中的圖標來恢復應用程序。如果我再將它最小化,然後單擊它出現的桌面圖標。

這是我在winform應用程序中的第二次嘗試,它與SetVisibleCore有關嗎?

任何指向正確方向的指針都會很棒。

+1

讓我看看你codez – animaonline

+0

看一看這個問題:http://stackoverflow.com/questions/4611828/maximize-application-in-system-tray – M4N

+0

我使用的代碼從上面的兩個鏈接,http://www.codeproject.com/KB/cs/SingleInstanceAppMutex/SingleInstanceMutexSampleV2.txt – Boomerang

回答

1

如果你讓你的WinForms應用程序一個單身的話,那是很容易使最小化的窗口還原,

http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx

它是使用WindowsFormsApplicationBase從Microsoft.VisualBasic.ApplicationServices命名空間的另一種變體。比使用Mutex更容易/更好。

您可以更改

void this_StartupNextInstance(object sender, StartupNextInstanceEventArgs e) 
    { 
     Form1 form = MainForm as Form1; //My derived form type 
     form.LoadFile(e.CommandLine[1]); 
    } 

void this_StartupNextInstance(object sender, StartupNextInstanceEventArgs e) 
    { 
     Form1 form = MainForm as Form1; //My derived form type 
     form.Show(); 
     form.WindowState = FormWindowState.Normal; 
    } 
+0

嗨,這是一個Winform應用程序? – Boomerang

+0

剛編輯我的答案。 –

+0

剛試過給出的例子,當我點擊我的桌面圖標時它根本不起作用,但它仍然顯示在我的系統托盤中。這個http://stackoverflow.com/questions/1730731/how-to-start-winform-app-minimized-to- tray中的任何代碼是否會引起衝突? – Boomerang

0

什麼,如果你寫在你的主恢復邏輯。您可以通過使用ShowWindow函數和SW_MAXIMIZE標誌來完成此操作。

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

    private const int SW_MAXIMIZE = 9; //Command to restore the window 

    [STAThread] 
    static void Main() 
    { 
     bool onlyInstance = false; 
     Mutex mutex = new Mutex(true, "UniqueApplicationName", out onlyInstance); 
     if (!onlyInstance) 
     { 
      Process[] p = Process.GetProcessesByName("UniqueApplicationName"); 
      SetForegroundWindow(p[0].MainWindowHandle); 
      ShowWindow(p[0].MainWindowHandle, SW_MAXIMIZE); 
      return; 
     } 
     Application.Run(new MainForm); 
     GC.KeepAlive(mutex); 
} 
相關問題