Подтвердить что ты не робот

Как проверить, запущен ли еще один экземпляр приложения

Возможные дубликаты:
Каков правильный способ создания одного экземпляра приложения? Вернитесь к уже открытому приложению, когда пользователь пытается открыть новый экземпляр

Может ли кто-нибудь показать, как можно проверить, запущен ли еще один экземпляр программы (например, test.exe), и если это так прекратить загрузку приложения, если есть его существующий экземпляр.

4b9b3361

Ответ 1

Хотите какой-нибудь серьезный код? Вот.

var exists = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1;

Это работает для любого приложения (любое имя) и станет true, если существует другой экземпляр того же приложения.

Изменить: Чтобы исправить ваши потребности, вы можете использовать любой из них:

if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) return;

из вашего основного метода, чтобы выйти из метода... OR

if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) System.Diagnostics.Process.GetCurrentProcess().Kill();

который немедленно уничтожит текущий процесс загрузки.


Вам нужно добавить ссылку на System.Core.dll для метода расширения .Count(). Кроме того, вы можете использовать свойство .Length.

Ответ 2

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

[STAThread]
static void Main()
{
    Mutex mutex = new System.Threading.Mutex(false, "MyUniqueMutexName");
    try
    {
        if (mutex.WaitOne(0, false))
        {
            // Run the application
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
        else
        {
            MessageBox.Show("An instance of the application is already running.");
        }
    }
    finally
    {
        if (mutex != null)
        {
            mutex.Close();
            mutex = null;
        }
    }
}

Ответ 3

Вот несколько хороших примеров приложений. Ниже приведен один из возможных способов.

public static Process RunningInstance() 
{ 
    Process current = Process.GetCurrentProcess(); 
    Process[] processes = Process.GetProcessesByName (current.ProcessName); 

    //Loop through the running processes in with the same name 
    foreach (Process process in processes) 
    { 
        //Ignore the current process 
        if (process.Id != current.Id) 
        { 
            //Make sure that the process is running from the exe file. 
            if (Assembly.GetExecutingAssembly().Location.
                 Replace("/", "\\") == current.MainModule.FileName) 

            {  
                //Return the other process instance.  
                return process; 

            }  
        }  
    } 
    //No other instance was found, return null.  
    return null;  
}


if (MainForm.RunningInstance() != null)
{
    MessageBox.Show("Duplicate Instance");
    //TODO:
    //Your application logic for duplicate 
    //instances would go here.
}

Многие другие возможные способы. См. Примеры альтернатив.

Первый.

Второй.

Third One

РЕДАКТИРОВАТЬ 1: только что увидел, что у вас есть консольное приложение. Это обсуждается в втором примере.

Ответ 4

Статический класс Process имеет метод GetProcessesByName(), который вы можете использовать для поиска через запущенные процессы. Просто выполните поиск любого другого процесса с тем же именем исполняемого файла.

Ответ 5

Вы можете попробовать это

Process[] processes = Process.GetProcessesByName("processname");
foreach (Process p in processes)
{
    IntPtr pFoundWindow = p.MainWindowHandle;
    // Do something with the handle...
    //
}

Ответ 6

Попробуйте найти Этот проект codeplex для приложения, использующего экземпляр.