Как убедиться, что один экземпляр приложения запущен
Я хочу проверить, когда пользователь дважды щелкните значок applictaion, что ни один другой экземпляр этого приложения не работает.
Я читал о моих.Приложение, но я все еще не знаю, что делать.
11 ответов
наиболее распространенным шаблоном для этого является использование одноэлементного шаблона. Поскольку вы не указали язык, я собираюсь предположить, что вы имеете в виду C# здесь - если нет, принципы все еще одинаковы в большинстве языков OO.
этой статья должна дать вам некоторую помощь.
Это то, что я использовал... (C# на .NET 2.0)
[STAThread]
private static void Main(string[] args)
{
//this follows best practices on
//ensuring that this is a single instance app.
string mutexName = "e50cf829-f6b9-471e-8d9f-67eac3699f09";
bool grantedOwnership;
//we prefix the mutexName with "Local\" to allow this to run under terminal services.
//The "Local\" prefix forces this into local user space.
//If we want to forbid this in TS, use the "Global\" prefix.
Mutex singleInstanceMutex = new Mutex(true, "Global\" + mutexName, out grantedOwnership);
try
{
if (!grantedOwnership)
{
MessageBox.Show("Error: X is already running.\n\nYou can only run one copy of X at a time.", "X", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
Application.Exit();
}
else
{
Application.Run(new X(args));
}
}
finally
{
singleInstanceMutex.Close();
}
}
в VB .NET есть IsSingleInstance логическое свойство, которое делает всю работу за вас.
в VB (взято из здесь):
Public Class Program
Inherits Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
Public Sub New()
Me.IsSingleInstance = True
End Sub
End Class
вот как вы используете его в C# (взято из здесь):
// SingleInstanceApplication.cs
class SingleInstanceApplication : WindowsFormsApplicationBase {
// Must call base constructor to ensure correct initial
// WindowsFormsApplicationBase configuration
public SingleInstanceApplication() {
// This ensures the underlying single-SDI framework is employed,
// and OnStartupNextInstance is fired
this.IsSingleInstance = true;
}
}
// Program.cs
static class Program {
[STAThread]
static void Main(string[] args) {
Application.EnableVisualStyles();
SingleInstanceApplication application =
new SingleInstanceApplication();
application.Run(args);
}
}
обязательно обратитесь к Microsoft.На языке VisualBasic.dll в вашем проекте.
у Скотта Хансельмана есть хорошая статья об этом. Код на C# , но я думаю, что его будет легко перенести на VB.
вот еще одна статья на эту тему в случае, если это не будет отвечать вашим потребностям:
откройте свойства проекта (вкладка "приложение") и проверьте сделать один экземпляр приложения.
на вкладке приложение также можно нажать кнопку Просмотр Событий-Приложения создать ApplicationEvents.vb класс, в котором вы можете обрабатывать событие второго экземпляра:
Partial Friend Class MyApplication
Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
' Bring First Instance to Foreground
e.BringToForeground = True
' Pass Second Instance Command Line to First Instance
AppShared.DoSomethingWithCommandLine(e.CommandLine)
End Sub
End Class
In VB.NET, один экземпляр приложения просто галочку на странице свойств проекта. Вы также можете поймать мой.Приложение.Пункт startupnextinstance событие, чтобы ваш единственный экземпляр что-то делал при запуске другой копии. Это можно использовать, например, для MDI-поведения открытия запрошенного документа в исходном экземпляре.
за кулисами это инкапсулирует хороший бит мьютекса и IPC goo-see WindowsFormApplicationBase - и может использоваться также С C#.
через советы выше, я узнал, как сделать мое приложение один экземпляр, но мне все равно пришлось перейти на другой сайт, чтобы узнать, как именно. Вот простая картина, как мне это удалось. Это было легко, и я надеюсь, что это поможет другим с той же необходимостью, потому что я уверен, что OP решил эту проблему 7 лет назад:
использовать Mutex
. Эффективно, а Mutex
может быть назван строкой и является уникальным для среды CLR.
пример кода:
try
{
mutex = Mutex.OpenExisting(mutexName);
//since it hasn’t thrown an exception, then we already have one copy of the app open.
MessageBox.Show(”A copy of Todo 3.0 is already open. Please check your system tray (notification area).”,
“Todo 3.0″, MessageBoxButtons.OK, MessageBoxIcon.Information);
Environment.Exit(0);
}
catch (Exception Ex)
{
//since we didn’t find a mutex with that name, create one
Debug.WriteLine(”Exception thrown:” + Ex.Message + ” Creating a new mutex…”);
mutex = new Mutex(true, mutexName);
}
отсюда в должности:
Если ваше приложение находится в VB.NET 2.0-3.5, самый простой способ сохранить один экземпляр программы работает с помощью "Windows Application Framework свойства". Чтобы попасть туда, щелкните правой кнопкой мыши на имени проекта и перейдите в раздел "Свойства". Оказавшись там, выберите флажок один экземпляр appliation'.
вы также можете использовать ApplicationEvents.vb, чтобы показать пользователю, что они запустили вашу программу во второй раз. Вы можете создать/просмотреть это легко в тех же свойствах окно, выбрав кнопку "Просмотр событий приложения". Внутри вы можете выбрать суб MyApplication_StartupNextInstance и ввести там код, например:
Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
MessageBox.Show("This program is already running. If you do not see the program running, please check your " _
& "Windows Task Manager for this program name in the 'Processes' Tab." & vbNewLine & vbNewLine & "WARNING: " _
& " If you terminate the process, you will terminate the only instance of this program!", My.Application.Info.ProductName.ToString _
& " is Running!", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Sub
Дайте мне знать, если это помогает! JFV
назначьте вашему приложению уникальный идентификатор, например, жестко закодированный guid и создайте экземпляр мьютекса, где вы назначаете мьютексу этот идентификатор. Если он выдает исключение, то если означает, что ваше приложение уже запущено (поскольку ему удалось создать мьютекс)
Я подумал, что было бы проще иметь образец прямо здесь, а не ссылку.
[STAThread]
static void Main()
{
if (!IsAppAlreadyRunning())
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); /* Change Form1 for your main Form */
}
else
{
MessageBox.Show("Application is already running!");
}
}
public static bool IsAppAlreadyRunning()
{
Process currentProcess = Process.GetCurrentProcess();
return (IsAppAlreadyRunning(currentProcess.Id,
currentProcess.ProcessName));
}
private static bool IsAppAlreadyRunning(int ID, string Name)
{
bool isAlreadyRunning = false;
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
if (ID != process.Id)
{
if (Name == process.ProcessName)
{
isAlreadyRunning = true;
break;
}
}
}
return isAlreadyRunning;
}