Ограничить несколько экземпляров приложения - PullRequest
12 голосов
/ 30 июля 2009

Итак, я создал свое приложение на c #, создал для него установщик и установил его на моем компьютере.

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

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

Ответы [ 5 ]

9 голосов
/ 30 июля 2009

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

См. это или это .

Код от 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");
    }
}
8 голосов
/ 30 июля 2009

я решил эту проблему этим

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

это просто, но я едва успел проверить лучшие решения.

4 голосов
/ 30 июля 2009

С благодарностью господа Аллен и Пауэлл :

    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);
            }
        }
    }
1 голос
/ 30 июля 2009
0 голосов
/ 30 июля 2009

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

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

...