Exemplo n.º 1
0
        /// <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();
            }
        }
Exemplo n.º 3
0
        /// <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();
            }
        }