Intereting Posts
Перезагрузите настройки конфигурации из внешнего файла конфигурации во время выполнения Чтение и запись на ключи реестра x86 и x64 из того же приложения «ClickOnce не поддерживает уровень выполнения запроса« requireAdministrator ».» Создание динамических предикатов – передача свойства в функцию в качестве параметра Почему родная DLL не копируется в выходной каталог Как выполнять параллельные задачи на Windows Phone? Преобразование объекта любого типа в JObject с помощью Json.NET XDocument Сохранить удаление префиксов узла как изменить расположение пользовательских настроек .NET Заполнение Gridview во время выполнения с помощью текстового файла Как отключить конкретное предупреждение для проекта C # в VS2012? Почему это полезно для доступа к статическим членам «через» унаследованные типы? Как программировать чтение встроенных DLL-импорта в C #? Как получить доступ к генерическому свойству, не зная закрытого родового типа Создавать разделенные запятыми строки C #?

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

У меня есть приложение Windows (C #), и мне нужно настроить его для запуска одного экземпляра из приложения в то время. Это означает, что один пользователь щелкнул файл .exe и приложение запустилось, и пользователь не закрыл первый экземпляр приложения, которое выполняется, и ему нужно запустить следующий экземпляр, чтобы он выглядел первым экземпляром, а не открывал новый.

может ли кто-нибудь помочь мне, как это сделать?

заранее спасибо

    Я часто решаю это, проверяя другие процессы с тем же именем. Преимущество / недостаток заключается в том, что вы (или пользователь) можете «отступить» от проверки, переименовав exe. Если вы не хотите, чтобы вы могли, вероятно, использовать возвращаемый объект Process.

    string procName = Process.GetCurrentProcess().ProcessName; if (Process.GetProcessesByName(procName).Length == 1) { ...code here... } 

    Это зависит от ваших потребностей, я думаю, что это удобно для обойти проверку witout перекомпиляции (это серверный процесс, который иногда запускается как служба).

    Команда VB.Net уже внедрила решение. Вам нужно будет зависеть от Microsoft.VisualBasic.dll, но если это вас не беспокоит, то это хорошее решение IMHO. См. Конец следующей статьи: Приложения с одним экземпляром

    Вот некоторые из статей:

    1) Добавьте ссылку на Microsoft.VisualBasic.dll. 2) Добавьте в свой проект следующий class.

     public class SingleInstanceApplication : WindowsFormsApplicationBase { private SingleInstanceApplication() { base.IsSingleInstance = true; } public static void Run(Form f, StartupNextInstanceEventHandler startupHandler) { SingleInstanceApplication app = new SingleInstanceApplication(); app.MainForm = f; app.StartupNextInstance += startupHandler; app.Run(Environment.GetCommandLineArgs()); } } 

    Откройте Program.cs и добавьте следующую инструкцию:

     using Microsoft.VisualBasic.ApplicationServices; 

    Измените class следующим образом:

     static class Program { ///  /// The main entry point for the application. ///  [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); SingleInstanceApplication.Run(new Form1(), StartupNextInstanceEventHandler); } public static void StartupNextInstanceEventHandler(object sender, StartupNextInstanceEventArgs e) { MessageBox.Show("New instance"); } } 

    Изменить: после того, как вопрос был изменен, чтобы включить c #. Мой ответ работает только для приложения vb.net

    установите флажок « Сделать отдельный экземпляр приложения», чтобы пользователи не запускали несколько экземпляров вашего приложения. Значение по умолчанию для этого флажка очищается, позволяя запускать несколько экземпляров приложения.

    Вы можете сделать это из Project -> Properties -> Application tab

    Источник

    У нас была такая же проблема. Мы пробовали процессный подход, но это не удается, если пользователь не имеет права читать информацию о других процессах, то есть не-админах. Поэтому мы внедрили решение ниже.

    В основном мы пытаемся открыть файл для эксклюзивного чтения. Если это не удается (поскольку экземпляр anohter уже сделал это), мы получаем исключение и можем выйти из приложения.

      bool haveLock = false; try { lockStream = new System.IO.FileStream(pathToTempFile,System.IO.FileMode.Create,System.IO.FileAccess.ReadWrite,System.IO.FileShare.None); haveLock = true; } catch(Exception) { System.Console.WriteLine("Failed to acquire lock. "); } if(!haveLock) { Inka.Controls.Dialoge.InkaInfoBox diag = new Inka.Controls.Dialoge.InkaInfoBox("App has been started already"); diag.Size = new Size(diag.Size.Width + 40, diag.Size.Height + 20); diag.ShowDialog(); Application.Exit(); } 

    Предполагая, что вы используете C #

      static Mutex mx; const string singleInstance = @"MU.Mutex"; ///  /// The main entry point for the application. ///  [STAThread] static void Main() { try { System.Threading.Mutex.OpenExisting(singleInstance); MessageBox.Show("already exist instance"); return; } catch(WaitHandleCannotBeOpenedException) { mx = new System.Threading.Mutex(true, singleInstance); } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } 

    Я бы использовал Mutex для этого сценария. Альтернативно, Semaphore также будет работать (но Mutex кажется более подходящим).

    Вот мой пример (из приложения WPF, но те же принципы должны применяться к другим типам проектов):

     public partial class App : Application { const string AppId = "MY APP ID FOR THE MUTEX"; static Mutex mutex = new Mutex(false, AppId); static bool mutexAccessed = false; protected override void OnStartup(StartupEventArgs e) { try { if (mutex.WaitOne(0)) mutexAccessed = true; } catch (AbandonedMutexException) { //handle the rare case of an abandoned mutex //in the case of my app this isn't a problem, and I can just continue mutexAccessed = true; } if (mutexAccessed) base.OnStartup(e); else Shutdown(); } protected override void OnExit(ExitEventArgs e) { if (mutexAccessed) mutex?.ReleaseMutex(); mutex?.Dispose(); mutex = null; base.OnExit(e); } } 

    Я нашел этот код , это работа!

      ///  /// The main entry point for the application. /// Limit an app.to one instance ///  [STAThread] static void Main() { //Mutex to make sure that your application isn't already running. 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 Form1()); } else { MessageBox.Show("An instance of the application is already running.", "An Application Is Running", MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Application Error 'MyUniqueMutexName'", MessageBoxButtons.OK, MessageBoxIcon.Information); } finally { if (mutex != null) { mutex.Close(); mutex = null; } } }