Как проверить, запущен ли еще один экземпляр приложения
Возможные дубликаты:
Каков правильный способ создания одного экземпляра приложения? Вернитесь к уже открытому приложению, когда пользователь пытается открыть новый экземпляр
Может ли кто-нибудь показать, как можно проверить, запущен ли еще один экземпляр программы (например, test.exe), и если это так прекратить загрузку приложения, если есть его существующий экземпляр.
Ответы
Ответ 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 для приложения, использующего экземпляр.