/// <summary> /// Processing single instance. /// </summary> /// <param name="singleInstanceModes"></param> internal static void Make(SingleInstanceModes singleInstanceModes) { var appName = Application.Current.GetType().Assembly.ManifestModule.ScopeName; var windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent(); var keyUserName = windowsIdentity != null ? windowsIdentity.User.ToString() : String.Empty; // Be careful! Max 260 chars! var eventWaitHandleName = string.Format( "{0}{1}", appName, singleInstanceModes == SingleInstanceModes.ForEveryUser ? keyUserName : String.Empty ); try { using (var eventWaitHandle = EventWaitHandle.OpenExisting(eventWaitHandleName)) { // It informs first instance about other startup attempting. eventWaitHandle.Set(); } // Let's terminate this posterior startup. // For that exit no interceptions. Environment.Exit(0); } catch { // It's first instance. // Register EventWaitHandle. using (var eventWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventWaitHandleName)) { ThreadPool.RegisterWaitForSingleObject(eventWaitHandle, OtherInstanceAttemptedToStart, null, Timeout.Infinite, false); } RemoveApplicationsStartupDeadlockForStartupCrushedWindows(); } }
/// <summary> /// Processing single instance. /// </summary> /// <param name="singleInstanceModes"></param> internal static void Make(SingleInstanceModes singleInstanceModes) { var appName = Application.Current.GetType().Assembly.ManifestModule.ScopeName; var windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent(); var keyUserName = windowsIdentity != null?windowsIdentity.User.ToString() : String.Empty; // Be careful! Max 260 chars! var eventWaitHandleName = string.Format("{0}{1}", appName, singleInstanceModes == SingleInstanceModes.ForEveryUser ? keyUserName : String.Empty); try { using (var eventWaitHandle = EventWaitHandle.OpenExisting(eventWaitHandleName)) { // It informs first instance about other startup attempting. eventWaitHandle.Set(); } // Let's terminate this posterior startup. // For that exit no interceptions. MessageBox.Show("البرنامج يعمل بالفعل"); Environment.Exit(0); } catch { // It's first instance. // Register EventWaitHandle. using (var eventWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventWaitHandleName)) { ThreadPool.RegisterWaitForSingleObject(eventWaitHandle, OtherInstanceAttemptedToStart, null, Timeout.Infinite, false); } RemoveApplicationsStartupDeadlockForStartupCrushedWindows(); } }
/// <summary> /// Processing single instance. /// </summary> /// <param name="singleInstanceModes"> /// The single instance modes /// </param> internal static void Make(SingleInstanceModes singleInstanceModes = SingleInstanceModes.ForEveryUser) { var appName = Application.Current.GetType().Assembly.ManifestModule.ScopeName; var keyUserName = string.Empty; if (singleInstanceModes == SingleInstanceModes.ForEveryUser) { var windowsIdentity = WindowsIdentity.GetCurrent(); keyUserName = windowsIdentity != null && windowsIdentity.User != null ? windowsIdentity.User.ToString() : string.Empty; } // Be careful! Max 260 chars! var eventWaitHandleName = string.Format("{0}{1}", appName, keyUserName); MultiInstance.Default.LastArgs = string.Empty; MultiInstance.Default.Save(); try { using (var eventWaitHandle = EventWaitHandle.OpenExisting(eventWaitHandleName)) { // It informs first instance about other startup attempting. string[] args = Environment.GetCommandLineArgs(); if (args.Length > 1) { MultiInstance.Default.LastArgs = string.Join(" ", args, 1, args.Length - 1); MultiInstance.Default.Save(); } eventWaitHandle.Set(); } // Let's terminate this posterior startup. // For that exit no interceptions. Environment.Exit(0); } catch { // It's first instance. // Register EventWaitHandle. using (var eventWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, eventWaitHandleName)) { ThreadPool.RegisterWaitForSingleObject( eventWaitHandle, OtherInstanceAttemptedToStart, null, Timeout.Infinite, false); } RemoveApplicationsStartupDeadlockForStartupCrushedWindows(); } }