In some scenarios launching multiple copies of the same WPF application is a problem, especially for document-based applications or server applications.
WPF does not provide a native solution for single instance applications.
Let See how to make a Single Instance Application in WPF.
Step 1
Create a WPF Application.
Step 2
Add a following code in app.xaml code behind,it is look like this
#region Constructor public App() { try { if (MultipleInstance()) // Check first multiple instance of application { MessageBox.Show("More than one instance is running"); System.Threading.Thread.Sleep(1000); ProcessKiller(); // Kill the current process } } catch (Exception ex) { MessageBox.Show(ex.Message); } } #endregion #region Static Methods /// <summary> /// Check Multiple Instance /// </summary> /// <returns>Boolean</returns> private static Boolean MultipleInstance() { Boolean Flag = false; try { System.Diagnostics.Process[] ProcessObj = null; ; // Name of Process module String ModualName = System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName.ToString(); // Get a process name String ProcessName = System.IO.Path.GetFileNameWithoutExtension(ModualName); // Get all instances of Current application running on the local computer. ProcessObj = System.Diagnostics.Process.GetProcessesByName(ProcessName); if (ProcessObj.Length > 1) // if multipal application is running then it is true otherwise it is false { Flag = true; } } catch (Exception ex) { throw new Exception(ex.Message); } return Flag; } /// <summary> /// kill the current Process /// </summary> private static void ProcessKiller() { try { System.Diagnostics.Process ProcessObj = System.Diagnostics.Process.GetCurrentProcess(); ProcessObj.Kill(); // kill the current process } catch (Exception ex) { throw new Exception(ex.Message); } } #endregion
Run the project
Download
Download Source Code
Thanks a lot, I adapted your code to my needs,
ReplyDeletecopy above InitializeComponent() :
String ModualName = System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName.ToString();
String ProcessName = System.IO.Path.GetFileNameWithoutExtension(ModualName);
var currProcs = Process.GetProcesses().Where(prc => prc.ProcessName.Contains(ProcessName));
if (currProcs.Count() > 1)
{
MessageBox.Show("Another istance already running!", ProcessName, MessageBoxButton.OK, MessageBoxImage.Information);
Application.Current.Shutdown(-1);
return;
}
Thanks ffor this blog post
ReplyDelete