2009-07-30 43 views
12

好吧,所以我創建了我的c#應用程序,爲它創建了一個安裝程序並讓它在我的機器上安裝。限制應用程序的多個實例

問題是,當用戶打開應用程序exe兩次時,會有兩個應用程序運行的實例。我只想讓應用程序的一個實例隨時運行,我該如何去做這件事?

感謝您的幫助,

回答

9

的常用技術是創建一個名爲Mutex,並檢查其是否在應用程序啓動的存在。

請參閱thisthis。從DDJ

代碼:

class App : Form 
{ 
    Mutex mutex; 

    App() 
    { 
     Text = "Single Instance!"; 
     mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX"); 
     if (!mutex.WaitOne(0, false)) 
     { 
      mutex.Close(); 
      mutex = null; 
     } 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
      mutex.ReleaseMutex(); 
     base.Dispose(disposing); 
    } 

    static void Main() 
    { 
     App app = new App(); 
     if (app.mutex != null) Application.Run(app); 
     else MessageBox.Show("Instance already running"); 
    } 
} 
+0

請在回答中顯示代碼。第一個環節已經死了,其他人最終可能會效仿。 – nothingisnecessary 2016-06-30 16:19:36

0

我不知道你是在工作環境中的事,但要牢記關於「單實例應用程序」是如何定義的單實例。如果應用程序可以同時在多個工作站上運行,那麼使用公共數據源就是一個問題?同樣,如果有多個用戶登錄到同一臺計算機上的終端服務情況(或稱「運行情況」),您是否希望限制應用程序,使得每個用戶只有一個實例-電腦?或者你可以簡單地將它作爲每個用戶一個實例嗎?

這些問題的答案可能會導致你在另一個方向上。例如,我們有一個「單實例」應用程序,其範圍是一組計算機。在該組工作站中只允許一個用戶。我們通過在我們的共享數據源中有一個表來跟蹤當前連接的用戶,從而實現了這一目標。這是一個維護問題,因爲您需要確保表格始終保持100%的準確性。處理工作站上意外停電等事件,在該表中留下「假」記錄需要小心處理。

4

與感謝Messrs.AllenPowell

static void Main() 
    { 
     using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) { 
      if (!mutex.WaitOne(0, false)) { 
       string processName = GetProcessName(); 
       BringOldInstanceToFront(processName); 
      } 
      else { 
       GC.Collect(); 
       Application.Run(new Voting()); 
      } 
     } 
    } 

    private static void BringOldInstanceToFront(string processName) { 
     Process[] RunningProcesses = Process.GetProcessesByName(processName); 
     if (RunningProcesses.Length > 0) { 
      Process runningProcess = RunningProcesses[0]; 
      if (runningProcess != null) { 
       IntPtr mainWindowHandle = runningProcess.MainWindowHandle; 
       NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED); 
      NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE); 
      } 
     } 
    } 
+0

代碼顯示似乎被@「全球\」拋出 - 我的歉意。 – lance 2009-07-30 16:14:57

8

我這個

[STAThread] 
static void Main() 
    { 

     Process[] result = Process.GetProcessesByName("ApplicationName"); 
     if (result.Length > 1) 
     { 
      MessageBox.Show("There is already a instance running.", "Information"); 
      System.Environment.Exit(0); 
     } 
     // here normal start 
    } 

它是簡單的解決了這個問題,但我幾乎沒有時間來檢查了更好的解決方案。

+0

如果任何人以不同的名稱獲取應用程序的副本並作爲新進程啓動,則會有多個實例。因此,請使用像描述或原始文件名稱那樣的'processObject.MainModule.FileInfo'字段,即使可執行文件被重命名也不會改變 – Sanjay 2017-06-16 11:23:52

相關問題