Загрузка...

Запрещаем запуск двух версий программы C#

Тема в разделе C# создана пользователем RaysMorgan 14 авг 2016. 2285 просмотров

Загрузка...
  1. RaysMorgan
    RaysMorgan Автор темы 14 авг 2016 https://lolz.live/support-tickets/open 51 794 7 мар 2013
    Всем привет! Сегодня будем делать запрет на запуск двух процессов программы. То есть, если программа запущена, то ещё одно окно этой программы открыть не получиться.

    Идём в Program.cs, в метод Main(), в самом начале вписываем:
    Код

    if (Process.GetProcessesByName("MySoft").Length > 1)
    {
    MessageBox.Show("Программа уже запущена");
    Application.Exit();
    return;
    }

    Что делает код? Мы получаем количество процессов с именем MySoft (.exe вписывать не нужно) и проверяем на его количество, если больше одного процесса, то закрываем прогу.

    Почему именно > 1 ?
    Если просто сделать проверку на наличие процесса, то проверка всегда будет выдавать true, ибо при запуске программы процесс сразу же виден в системе
     
  2. AnyBoom
    AnyBoom 15 авг 2016 0 13 авг 2016
    А разве не с 0 ?
    "> 0"
     
  3. FunArt_inactive
    Почему именно > 1 ?
    Если просто сделать проверку на наличие процесса, то проверка всегда будет выдавать true, ибо при запуске программы процесс сразу же виден в системе
     
  4. iPro_inactive
    iPro_inactive 17 авг 2016 Заблокирован(а) 30 15 июн 2016
    Тоже ненадежный способ, процесс переименовать могут, я такую шляпу использую, хотя посути проапгрейженая версия этого способа

    Код

    private static Process PriorProcess()
    {
    try
    {
    var curr = Process.GetCurrentProcess();
    var procs = Process.GetProcessesByName(curr.ProcessName);

    foreach (Process p in procs)
    {
    if ((p.Id != curr.Id) &&
    (p.MainModule.FileName == curr.MainModule.FileName))
    return p;
    }
    return null;
    }
    catch (Exception)
    {
    return null;
    }
    }
    Код

    [STAThread]
    static void Main()
    {
    if (PriorProcess() != null)
    {
    return;
    }
    // ...
    Можно еще через мьютексы, шоб уже наверняка
     
  5. RaysMorgan
    RaysMorgan Автор темы 17 авг 2016 https://lolz.live/support-tickets/open 51 794 7 мар 2013
    iPro_inactive, твой способ для тех, кому нужна защита от перегрузки сервера, буду юзать =)
    Закинь отдельной темой
     
  6. wander_inactive
    Код
      [STAThread]

    private static void Main() {
    bool createdNew;
    // ReSharper disable once ObjectCreationAsStatement
    new Mutex(false, " ", out createdNew);
    if (!createdNew)
    {
    MessageBox.Show(@"Программа уже запущена.", @"Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Hand);
    return;
    }


    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
    }


    Так не проще? Если изменить имя файла, всё равно не запустится программа второй раз.
     
  7. sett9
    Вот так ещё можно
    Код
    static Mutex mutex;
    /// <summary>
    /// Главная точка входа для приложения.
    /// </summary>
    [STAThread]
    static void Main()
    {
    bool created;
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    mutex = new Mutex(true, "3kGLX8ZS53zdL0", out created);
    if (!created)
    {
    MessageBox.Show("Error!", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
    Application.Exit();

    }
    Application.Run(new Form1());
    mutex.Dispose();

    }
     
Top