пятница, 23 ноября 2012 г.

Запуск одного экземпляра приложения

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


using System;
using System.Windows.Forms;
using System.Threading;

namespace OneCopyOfApp
{
    static class Program
    {
        private static Mutex m_instance;
        private const string m_appName = "NameOfMyApp";

        [STAThread]
        static void Main()
        {
            bool tryCreateNewApp;
            m_instance = new Mutex(true, m_appName, 
                    out tryCreateNewApp);
            if (tryCreateNewApp)
            {
                Application.EnableVisualStyles();
                Application.
                  SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
                return;
            }          
        }
    }
}



Есть второй, более безопасный в отношении атак способ. Основан он на библиотеках VB. Для начала добавьте ссылку на сборку Microsoft.VisualBasic.dll.
Для удобства вынести в начало проекта пространство имен Microsoft.VisualBasic.ApplicationServices. Ну а сам код следующий (обратите внимание каким образом мы вызываем метод Run())


using System;
using System.Windows.Forms;
using System.Threading;
using Microsoft.VisualBasic.ApplicationServices;

namespace OneCopyOfApp
{
    public class OneInstanceApp : 
        WindowsFormsApplicationBase
    {
        private SingleInstanceApplication()
        {
            base.IsSingleInstance = true;
        }

        public static void Run(Form form,
            StartupNextInstanceEventHandler startupHandler)
        {
            OneInstanceApp app = 
                new OneInstanceApp();
            app.MainForm = form;
            app.StartupNextInstance += startupHandler;
            app.Run(Environment.GetCommandLineArgs());
        }
    }

    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            OneInstanceApp.Run(new Form1(),
                StartupNextInstanceHandler);
        }

        static void StartupNextInstanceHandler(
            object sender, StartupNextInstanceEventArgs e)
        {
            MessageBox.Show(e.CommandLine[0]);
        }
    }
}

Комментариев нет:

Отправить комментарий