Revision: 17437
Updated Code
at August 28, 2011 13:59 by jimfred
Updated Code
Example usage: static void Main() { SingleInstanceCheck.Check(); ... Implementation: /// <summary> /// This checks for another instance of an app. /// Use inside Main() by calling SingleInstanceCheck.Check(); /// Include this class as a sibling to Main's class. /// If another instance of the app is detected, /// - A message box appears. /// - 'this' instance calls Exit. /// </summary> /// <example> /// static void Main() /// { /// MyApp.SingleInstanceCheck.Check(); /// Application.EnableVisualStyles(); /// Application.SetCompatibleTextRenderingDefault(false); /// Application.Run(new Form1()); /// } /// </example> public static class SingleInstanceCheck { [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); static public void Check() { // http://snipplr.com/view/19272/ - C#, single-instance-check using mutex // http://iridescence.no/post/CreatingaSingleInstanceApplicationinC.aspx bool isOwnedHere = false; appStartMutex = new System.Threading.Mutex( true, Application.ProductName, out isOwnedHere ); if (!isOwnedHere) // if owned by other process. { string message = string.Format("There is already a copy of the application {0} running.\n\nClick cancel to exit.", Application.ProductName); DialogResult x = MessageBox.Show(message, Application.ProductName + " already running", MessageBoxButtons.OKCancel); if (x == DialogResult.Cancel) // Cancel, but show the already-existing process. { Process me = Process.GetCurrentProcess(); foreach (Process process in Process.GetProcessesByName(me.ProcessName)) // Debug note: Set Enable the Visual Studio Hosting Process = false. { if (process.Id != me.Id) // If the ProcessName matches but the Id doesn't, it's another instance of mine. { SetForegroundWindow(process.MainWindowHandle); break; } } Environment.Exit(0); // This will kill my instance. } } } // volatile is intended to prevent GC. Otherwise, GC.KeepAlive(appStartMutex) might be needed. // This appears to be a concern in In release builds but not debug builds. static volatile System.Threading.Mutex appStartMutex; }
Revision: 17436
Updated Code
at August 28, 2011 13:58 by jimfred
Updated Code
Example usage: static void Main() { SingleInstanceCheck.Check(); ... Implementation: /// <summary> /// This checks for another instance of an app. /// Use inside Main() by calling SingleInstanceCheck.Check(); /// Include this class as a sibling to Main's class. /// If another instance of the app is detected, /// - A message box appears. /// - 'this' instance calls Exit. /// </summary> /// <example> /// static void Main() /// { /// Snapshot.SingleInstanceCheck.Check(); /// Application.EnableVisualStyles(); /// Application.SetCompatibleTextRenderingDefault(false); /// Application.Run(new Form1()); /// } /// </example> public static class SingleInstanceCheck { [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); static public void Check() { // http://snipplr.com/view/19272/ - C#, single-instance-check using mutex // http://iridescence.no/post/CreatingaSingleInstanceApplicationinC.aspx bool isOwnedHere = false; appStartMutex = new System.Threading.Mutex( true, Application.ProductName, out isOwnedHere ); if (!isOwnedHere) // if owned by other process. { string message = string.Format("There is already a copy of the application {0} running.\n\nClick cancel to exit.", Application.ProductName); DialogResult x = MessageBox.Show(message, Application.ProductName + " already running", MessageBoxButtons.OKCancel); if (x == DialogResult.Cancel) // Cancel, but show the already-existing process. { Process me = Process.GetCurrentProcess(); foreach (Process process in Process.GetProcessesByName(me.ProcessName)) // Debug note: Set Enable the Visual Studio Hosting Process = false. { if (process.Id != me.Id) // If the ProcessName matches but the Id doesn't, it's another instance of mine. { SetForegroundWindow(process.MainWindowHandle); break; } } Environment.Exit(0); // This will kill my instance. } } } // volatile is intended to prevent GC. Otherwise, GC.KeepAlive(appStartMutex) might be needed. // This appears to be a concern in In release builds but not debug builds. static volatile System.Threading.Mutex appStartMutex; }
Revision: 17435
Updated Code
at March 16, 2011 09:13 by jimfred
Updated Code
Example usage: static void Main() { SingleInstanceCheck.Check(); ... Implementation: // This checks for another instance of an app. // Use inside Main() by calling SingleInstanceCheck.Check(); // Include this class as a sibling to Main's class. // If another instance of the app is detected, // - A message box appears. // - 'this' instance calls Exit. public static class SingleInstanceCheck { static public void Check() { // http://snipplr.com/view/19272/ - C#, single-instance-check using mutex bool isOwnedHere = false; appStartMutex = new System.Threading.Mutex( true, Application.ProductName, out isOwnedHere ); if (!isOwnedHere) // if owned by other process. { string message = string.Format( "There is already a copy of the application {0} running.\n\nClick cancel to exit.", Application.ProductName ); DialogResult x = MessageBox.Show( message, Application.ProductName + " already running", MessageBoxButtons.OKCancel ); if (x == DialogResult.Cancel) { Environment.Exit(0); } } } // volatile is intended to prevent GC. Otherwise, GC.KeepAlive(appStartMutex) might be needed. // This appears to be a concern in In release builds but not debug builds. static volatile System.Threading.Mutex appStartMutex; }
Revision: 17434
Updated Code
at March 16, 2011 09:11 by jimfred
Updated Code
Example usage (in Main()): SingleInstanceCheck.Check(); Implementation: // This checks for another instance of an app. // Use inside Main() by calling SingleInstanceCheck.Check(); // Include this class as a sibling to Main's class. // If another instance of the app is detected, // - A message box appears. // - 'this' instance calls Exit. public static class SingleInstanceCheck { static public void Check() { // http://snipplr.com/view/19272/ - C#, single-instance-check using mutex bool isOwnedHere = false; appStartMutex = new System.Threading.Mutex( true, Application.ProductName, out isOwnedHere ); if (!isOwnedHere) // if owned by other process. { string message = string.Format( "There is already a copy of the application {0} running.\n\nClick cancel to exit.", Application.ProductName ); DialogResult x = MessageBox.Show( message, Application.ProductName + " already running", MessageBoxButtons.OKCancel ); if (x == DialogResult.Cancel) { Environment.Exit(0); } } } // volatile is intended to prevent GC. Otherwise, GC.KeepAlive(appStartMutex) might be needed. // This appears to be a concern in In release builds but not debug builds. static volatile System.Threading.Mutex appStartMutex; }
Revision: 17433
Updated Code
at August 9, 2010 09:06 by jimfred
Updated Code
Example usage (in Main()): SingleInstanceCheck.Check(); Implementation: // This checks for another instance of an app. // Use inside Main() by calling SingleInstanceCheck.Check(); // Include this class as a sibling to Main's class. // If another instance of the app is detected, // - A message box appears. // - 'this' instance calls Exit. public static class SingleInstanceCheck { static public void Check() { // http://snipplr.com/view/19272/ - C#, single-instance-check using mutex bool isOwnedHere = false; appStartMutex = new System.Threading.Mutex( true, Application.ProductName, out isOwnedHere ); if (!isOwnedHere) // if owned by other process. { string message = "There is already a copy of the application " + Application.ProductName + " running. "; MessageBox.Show(message); Environment.Exit(0); } } // volatile is intended to prevent GC. Otherwise, GC.KeepAlive(appStartMutex) might be needed. // This appears to be a concern in In release builds but not debug builds. static volatile System.Threading.Mutex appStartMutex; }
Revision: 17432
Updated Code
at August 9, 2010 08:58 by jimfred
Updated Code
Example usage (in Main()): SingleInstanceCheck.Check(); Implementation: // This checks for another instance of an app. // Use inside Main() by calling SingleInstanceCheck.Check(); // Include this class as a sibling to Main's class. // If another instance of the app is detected, // [1] that instance is brought to the top // [2] A message box appears. // [3] 'this' instance calls Exit. public static class SingleInstanceCheck { static public void Check() { // http://snipplr.com/view/19272/ - C#, single-instance-check using mutex bool isOwnedHere = false; appStartMutex = new System.Threading.Mutex( true, Application.ProductName, out isOwnedHere ); if (!isOwnedHere) // if owned by other process. { string message = "There is already a copy of the application " + Application.ProductName + " running. "; MessageBox.Show(message); // Get process by process name. System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName(Application.ProductName); // Verify some assumptions. System.Diagnostics.Debug.Assert(procs.Length == 1); System.Diagnostics.Debug.Assert(procs[0] != System.Diagnostics.Process.GetCurrentProcess()); // Bring to the front. BringWindowToTop(procs[0].MainWindowHandle); // SetWindowPos(procs[0].MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); SetWindowPos(procs[0].MainWindowHandle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW | SWP_NOACTIVATE); Environment.Exit(0); } } // volatile is intended to prevent GC. Otherwise, GC.KeepAlive(appStartMutex) might be needed. // This appears to be a concern in In release builds but not debug builds. static volatile System.Threading.Mutex appStartMutex; #region pinvoke stuff. [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern int SetWindowPos( IntPtr hwnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, int wSwpFlags); [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern int BringWindowToTop(IntPtr hwnd); private static IntPtr HWND_TOP = (IntPtr)(0); private static IntPtr HWND_TOPMOST = (IntPtr)(-2); private static int SWP_NOSIZE = 0x1; private static int SWP_NOMOVE = 0x2; private static int SWP_SHOWWINDOW = 0x0040; private static int SWP_NOACTIVATE = 0x0010; #endregion }
Revision: 17431
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at September 4, 2009 15:01 by jimfred
Initial Code
// Put inside Main() before Application.Run(new MainForm()); #region Single-Instance check bool isOwned = false; System.Threading.Mutex appStartMutex = new System.Threading.Mutex( true, Application.ProductName, out isOwned ); if (!isOwned) { string message = "There is already a copy of the application " + Application.ProductName + " running. "; MessageBox.Show(message); Environment.Exit(0); } #endregion
Initial URL
http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx
Initial Description
Scott Hanselman describes a method of using VB libraries to handle single-instance checking to prevent multiple instances of an app from starting. A mutex seems to be a simpler solution.\r\n\r\nAdd this class as a sibling to Main and then, inside Main, call this static member: SingleInstanceCheck.Check();
Initial Title
C#, single-instance-check using mutex. Implements a static function to be called in Program::Main().
Initial Tags
Initial Language
C#