2014-12-25 59 views
1

我有一個wpf應用程序,我必須讓應用程序只運行一次。一臺機器上不應該有多個實例。防止應用程序運行兩次,而不是顯示第一個窗口

這是我在App.xaml.cs代碼,在OnStartup()方法:

var runningProcess = GetAnotherAppInstanceIfExists(); 

      if (runningProcess != null) 
      { 
       HandleMultipleInstances(runningProcess); 
       Environment.Exit(0); 
      } 

public Process GetAnotherAppInstanceIfExists() 
    { 
     var currentProcess = Process.GetCurrentProcess(); 

     var appProcesses = new List<string> { "myApp", "myApp.vshost" }; 

     var allProcesses = Process.GetProcesses(); 

     var myAppProcess = (from process in allProcesses 
      where process.Id != currentProcess.Id && appProcesses.Contains(process.ProcessName) 
      select process).FirstOrDefault(); 

     if (myAppProcess != null) 
     { 
      return currentProcess; 
     } 

     return myAppProcess; 
    } 

public void HandleMultipleInstances(Process runningProcess) 
    { 
     SetForegroundWindow(runningProcess.MainWindowHandle); 
     ShowWindow(runningProcess.MainWindowHandle, SW_RESTORE); 
    } 

所以應用程序,當第二次跑,犯規打開一個新的實例,這是偉大的。但是,如果最小化,我需要找到第一個實例並再次顯示窗口。這條線是爲了:

ShowWindow(runningProcess.MainWindowHandle, SW_RESTORE); 

它不起作用。我究竟做錯了什麼?我在網上查了很多例子,我的代碼和他們一樣。

回答

0

首先將您的App.xaml文件的構建操作更改爲頁面。然後,您可以在App.xaml.cs中使用此代碼片段:

private static readonly Mutex Mutex = new Mutex(true, "put your unique value here or GUID"); 
    private static MainWindow _mainWindow;  

    [STAThread] 
    static void Main() 
    { 
     if (Mutex.WaitOne(TimeSpan.Zero, true)) 
     { 
      var app = new App(); 
      _mainWindow = new MainWindow(); 
      app.Run(_mainWindow); 
      Mutex.ReleaseMutex(); 
     } 
     else 
     { 
      //MessageBox.Show("You can only run one instance!"); 
      _mainWindow.WindowState = WindowState.Maximized; 
     } 
    } 
+0

這是如何最大化已打開的應用程序的窗口? –

+0

我編輯了代碼片段。您可以將WindowState設置爲最大化來實現此目的。 –

相關問題