Banshee
Banshee

Reputation: 15837

Singleton of a Winform Application but provide parameters?

I have a webform(c#) application that should only be able to run in a single instance. Its also important that if the applcation is started again(click on app icon) then the new parameters should be forwarded to the current instance but now application are to be started.

I have ofcouse google the problem and found this : http://www.sanity-free.com/143/csharp_dotnet_single_instance_application.html

This is how I have set it up so far :

public class MyApp : ApplicationContext
{
        private static MyApp _instance;
        private static Mutex _mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");

        [STAThread]
        public static void Main(string[] args)
        {
             MyParams params;

             params = ExtractParams(args);

             if (_mutex.WaitOne(TimeSpan.Zero, true))
             {
                  _instance = new MyAppp(params);
                  Application.Run(_instance);
             }
             else
             {
                  _instance.SetParameters(params);
             }
        }
}

The problem with this is that the second time I try to start the program I will get an exception in the else that _instance is null?

What am I doing wrong here?

Upvotes: 1

Views: 790

Answers (2)

Kieran Dang
Kieran Dang

Reputation: 447

In this case, it's a Inter-process communication (IPC) so _instance doesn't sense. If you want to have IPC, there're some ways to do: socket, namepiped, messaging ...

I think 2 methods are suited:

  1. Get the previous process by the process name -> call P/Invoke EnumWindows method to get the main window handle. Send a message with ID has been registered with RegisterWindowMessage before, to pass parameters.
  2. Create a namedpipe server to listen for the parameters of the new process.

Upvotes: 1

Stephan
Stephan

Reputation: 4247

The .NET assembly Microsoft.VisualBasic.dll contains a class called WindowsFormsApplicationBase. This one can also be used by C# applications and has a property called IsSingleInstance, which can be set to achieve the required behaviour.

At first application start you can register an event handler for further application starts. From the event args you can extract command line parameters of every additional start.

See an example here.

Upvotes: 2

Related Questions