| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | using System;using System.Collections.Generic;using System.Configuration;using System.Data;using System.Linq;using System.Threading;using System.Threading.Tasks;using System.Windows;using System.Windows.Input;namespace PRSRecordingNotes{    /// <summary>    /// Interaction logic for App.xaml    /// </summary>    public partial class App : Application    {        #region Constants and Fields        /// <summary>The event mutex name.</summary>        private const string UniqueEventName = "27722504-3ECA-4493-A942-DF08FFD92500";        /// <summary>The unique mutex name.</summary>        private const string UniqueMutexName = "65B5069F-33AB-42A1-AB42-3E495097A859";        /// <summary>The event wait handle.</summary>        private EventWaitHandle eventWaitHandle;        /// <summary>The mutex.</summary>        private Mutex mutex;        #endregion        #region Methods        /// <summary>The app on startup.</summary>        /// <param name="sender">The sender.</param>        /// <param name="e">The e.</param>        private void AppOnStartup(object sender, StartupEventArgs e)        {            bool isOwned;            this.mutex = new Mutex(true, UniqueMutexName, out isOwned);            this.eventWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, UniqueEventName);            // So, R# would not give a warning that this variable is not used.            GC.KeepAlive(this.mutex);            if (isOwned)            {                // Spawn a thread which will be waiting for our event                var thread = new Thread(                    () =>                    {                        while (this.eventWaitHandle.WaitOne())                        {                            Current.Dispatcher.BeginInvoke(                                (Action)(() => ((ScreenRecorderWindow)Current.MainWindow).BringToForeground()));                        }                    });                // It is important mark it as background otherwise it will prevent app from exiting.                thread.IsBackground = true;                thread.Start();                return;            }            // Notify other instance so it could bring itself to foreground.            this.eventWaitHandle.Set();            // Terminate this instance.            this.Shutdown();        }        #endregion    }}
 |