Загрузка...

Preventing two versions of a C# program from running

Thread in C# created by RaysMorgan Aug 14, 2016. 2296 views

  1. RaysMorgan
    RaysMorgan Topic starter Aug 14, 2016 Че скажете 53,985 Mar 7, 2013
    Всем привет! Сегодня будем делать запрет на запуск двух процессов программы. То есть, если программа запущена, то ещё одно окно этой программы открыть не получиться.

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

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

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

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

    Code

    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;
    }
    }
    Code

    [STAThread]
    static void Main()
    {
    if (PriorProcess() != null)
    {
    return;
    }
    // ...
    Можно еще через мьютексы, шоб уже наверняка
     
  5. RaysMorgan
    RaysMorgan Topic starter Aug 17, 2016 Че скажете 53,985 Mar 7, 2013
    iPro_inactive, твой способ для тех, кому нужна защита от перегрузки сервера, буду юзать =)
    Закинь отдельной темой
     
  6. wander_inactive
    Code
      [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
    Вот так ещё можно
    Code
    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();

    }
     
Loading...
Top