I have a Windows Forms application that allows only one instance to be running at the time. I have implemented Singleton by using Mutex. The Application must be startable fr
I think the easiest way is the following
see the link
http://codenicely.blogspot.com/2010/04/creating-forms-object.html
The .NET framework offers a very good generic solution for this. Check the bottom of this MSDN magazine article. Use the StartupNextInstanceHandler() event handler to pass arbitrary commands to the running instance, like "quit".
This is a somewhat quick-and-dirty solution which you would probably want to refine:
[STAThread]
static void Main()
{
var me = Process.GetCurrentProcess();
var otherMe = Process.GetProcessesByName(me.ProcessName).Where(p => p.Id != me.Id).FirstOrDefault();
if (otherMe != null)
{
otherMe.Kill();
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
If an instance of the app is already started, that process is killed; otherwise the app starts normally.
Is this not over complicating things ? Rather than closing the existing instance and starting a new one, can you not just re-activate the existing instance? Either way round the code below should give you some ideas on how to go about it...?
Process thisProcess = Process.GetCurrentProcess();
Process[] allProcesses = Process.GetProcessesByName(thisProcess.ProcessName);
Process otherProcess = null;
foreach (Process p in allProcesses )
{
if ((p.Id != thisProcess.Id) && (p.MainModule.FileName == thisProcess.MainModule.FileName))
{
otherProcess = p;
break;
}
}
if (otherProcess != null)
{
//note IntPtr expected by API calls.
IntPtr hWnd = otherProcess.MainWindowHandle;
//restore if minimized
ShowWindow(hWnd ,1);
//bring to the front
SetForegroundWindow (hWnd);
}
else
{
//run your app here
}
There is another question about this here