2009-07-30 19 views
12

Ok, więc utworzyłem aplikację C#, utworzyłem instalator i zainstalowałem ją na moim komputerze.Ogranicz wielokrotne instancje aplikacji

Problem polega na tym, że gdy użytkownik otworzy aplikację exe dwa razy, będą uruchomione dwa wystąpienia aplikacji. Chciałbym, aby tylko jedna instancja aplikacji działała w dowolnym momencie, jak mam to zrobić?

Dzięki za pomoc,

Odpowiedz

9

Wspólne technika jest to, aby stworzyć nazwie Mutex i sprawdzić jego obecności na starcie programu.

Zobacz this lub this.

Kod z 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

Proszę pokazać kod w odpowiedzi. Pierwszy link był martwy, a inni mogą pójść w jego ślady. – nothingisnecessary

0

nie znam środowiska, które działają w, ale coś, aby pamiętać o "aplikacji pojedynczej Instancji sposób można określić pojedynczej instancji. Jeśli aplikacja może być uruchomiona na wielu stacjach roboczych w tym samym czasie, przy użyciu wspólnego źródła danych, czy jest to problem? Podobnie, co z sytuacją usług terminalowych (lub sytuacją "uruchom jako"), w której więcej niż jeden użytkownik jest zalogowany na tym samym komputerze, czy chcesz ograniczyć aplikację w taki sposób, aby tylko jedna instancja na użytkownika, na -komputer? A może wszystko w porządku, ponieważ jest to po prostu jedna instancja na użytkownika?

Odpowiedź na nie może prowadzić w jednym kierunku do drugiego. Na przykład mamy aplikację "pojedynczej instancji", której zasięg to grupa komputerów. Tylko jeden użytkownik jest dozwolony na tej grupie stacji roboczych. Udało nam się to poprzez posiadanie tabeli w naszym wspólnym źródle danych, które śledzi aktualnie podłączonych użytkowników. Jest to problem związany z konserwacją, ponieważ musisz mieć pewność, że stół jest zawsze w 100% dokładny. Obsługa rzeczy, takich jak nieoczekiwane przerwy w zasilaniu stacji roboczej, pozostawienie "fałszywych" rekordów w tym stole wymagało ostrożnej obsługi.

4

Z podziękowaniami dla Messrs.Allen i Powell:

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

Wygląd kodu wydaje się być wyrzucony przez @ "Global \" - moje przeprosiny. – lance

8

I rozwiązać ten problem przez ten

[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 
    } 

to jest proste, ale Ledwo czas, aby sprawdzić, lepszych rozwiązań.

+0

Jeśli ktoś wykona kopię aplikacji pod inną nazwą i rozpocznie się jako nowy proces, pojawi się wiele instancji. Wykorzystaj więc pola 'processObject.MainModule.FileInfo', takie jak opis lub oryginalna nazwa pliku .. które nie ulegają zmianie, nawet jeśli nazwa pliku wykonywalnego jest zmieniona – Sanjay