2009-07-30 4 views
12

Итак, я создал свое приложение C#, создал для него установщик и установил его на моей машине.Ограничить несколько экземпляров приложения

Проблема в том, что, когда пользователь дважды открывает приложение exe, будут выполняться два экземпляра приложения. Я только хочу, чтобы один экземпляр приложения запускался в любое время, как я могу это сделать?

Спасибо за вашу помощь,

ответ

9

Общий метод для этого является создание именованного Mutex и проверить его наличие при запуске приложения.

См. this или this.

код из 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

0

Я не знаю окружающую среду, что вы работаете в, но что-то иметь в виду, о «приложений в одном экземпляре», как вы определяете в единственном экземпляре. Если приложение может работать одновременно на нескольких рабочих станциях, используя общий источник данных, это проблема? Аналогично, что касается ситуации с терминальными службами (или ситуации «как работа»), когда на один и тот же компьютер регистрируется более одного пользователя, вы хотите ограничить приложение таким образом, чтобы только один экземпляр для каждого пользователя за -Компьютер? Или вы в порядке, просто один экземпляр для пользователя?

Ответ на них может привести вас в одном направлении над другим. Например, у нас есть приложение с одним экземпляром, а область - группа компьютеров. В пределах этой группы рабочих станций допускается только один пользователь. Мы справились с этим, указав таблицу в нашем общем источнике данных, которая отслеживала пользователей, подключенных в настоящее время. Это проблема обслуживания, так как вам нужно быть уверенным, что таблица на 100% точна все время. Обработка таких вещей, как непредвиденные отключения электроэнергии на рабочей станции, оставляя «поддельные» записи в этой таблице, требует некоторой осторожной обработки.

4

С благодарностью Messrs.Allen и 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

Отображение кода, похоже, сбрасывается @ "Global \" - мои извинения. – lance

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

Смежные вопросы