Защита программы от множественного запуска

Поскольку создание приложения для Windows Forms и WPF отличается, в статье рассмотрим оба варианта.

Для того, чтобы разрешить запуск программы только в одном экземпляре на Windows Forms, достаточно в файле Program.cs добавить проверку на соответствие в запущенных процессах:

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (System.Diagnostics.Process.GetProcessesByName(Application.ProductName).Length > 1)
            {
                MessageBox.Show("Приложение уже запущено");
                return;
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    }
}

Получается, что, если наше приложение уже выполняется, то мы просто обрываем дальнейшее выполнение программы и оповещаем пользователя об этом.


Если ваше приложение работает на WPF, то исключать параллельный запуск программы мы будем иначе. Чтобы реализовать подобный функционал, нам нужно открыть файл App.xaml и удалить атрибут StartupUri для того, чтобы мы могли самостоятельно задать главное окно и условия. Такой код App.xaml должен получиться в новом приложении:

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>

Давайте зайдем в App.xaml.cs, изначально он будет пустым:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApp1
{
    /// <summary>
    /// Логика взаимодействия для App.xaml
    /// </summary>
    public partial class App : Application
    {
    }
}

Если сейчас запустить приложение, то будет висеть процесс, но окно отображено не будет и завершить его можно только диспетчером задач. Это потому, что ни одно окно не инициализировано при старте. Чтобы программа стала видимой, нам нужно самостоятельно создать окно, не забыв при этом задать условие:

using System.Windows;

namespace WpfApp1
{
    /// <summary>
    /// Логика взаимодействия для App.xaml
    /// </summary>
    public partial class App : Application
    {
        //Переопределяем метод OnStartup
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            //Проверяем запущено ли приложение
            if (System.Diagnostics.Process.GetProcessesByName(ResourceAssembly.GetName().Name).Length > 1)
            {
                //Если да, то выводим сообщение и завершаем текущий процесс
                MessageBox.Show("Приложение уже запущено");
                Current.Shutdown();
            }
            else
            {
                //Инициализируем окно
                MainWindow window = new MainWindow();
                window.Show();
            }
        }
    }
}

Всем спасибо за внимание.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.