C#

УЧЕБНЫЕ МАТЕРИАЛЫ ПО ПРОГРАММИРОВАНИЮ, КРЕКИНГУ, HTML, CSS, ОФИСНЫМ ПРИЛОЖЕНИЯМ

[Главная страница] [Контакты]

Программирование для Windows


Разрешение запуска только одного экземпляра приложения

ЗАДАЧА
Вы хотите гарантировать, что в конкретный момент времени сможет выполняться только один экземпляр вашего приложения.

РЕШЕНИЕ
Изучите в стартовом коде приложения выполняющиеся процессы и определите, загружено ли уже ваше приложение.

ОБСУЖДЕНИЕ
Для запрещения запуска нескольких экземпляров приложения нужно просто отказывать ему в запуске при наличии уже выполняющегося экземпляра. Изучить выполняющиеся в данный момент процессы позволяет класс System.Diagnostics.Process.

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

using System;
using System.Diagnostics;

namespace OneInstanceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] Proc;

            // Определение полного имени текущего процесса.
            string ModuleName, ProcName;
            ModuleName = Process.GetCurrentProcess().MainModule.ModuleName;
            ProcName = System.IO.Path.GetFileNameWithoutExtension(ModuleName);

            // Нахождение всех процессов с данным именем.
            Proc = Process.GetProcessesByName(ProcName);
            if (Proc.Length > 1)
            {
                // Данное имя имеют несколько процессов, поэтому
                // текущий экземпляр следует завершить
                Console.WriteLine("Этот экземпляр должен быть завершен");
            }
            else
            {
                Console.WriteLine("Этот экземпляр может работать");
            }
            Console.ReadLine();
        }
    }
}

Помните этот тест требуется выполнять при запуске программы.

Если вы подозреваете, что другая программа может иметь такое же ймя, что и ваша, то можете получить полный список процессов, вызвав метод Process.GetProcesses, и изучить каждый из них подробнее. Например, вы можете изучить свойство Process.MainModule для определения имени исполняемого файла.

Используемая литература:

  1. Занимательное программирование на Bisual Basic.NET: Климов А.П.
  2. Программирование для Microsoft Windows на C#: Чарльз Петцольд.
  3. РеРецепты программирования на Visual Basic.NET: Мэтью Макдональд.