单个Winform应用程序,但提供参数?

时间:2011-09-19 09:23:44

标签: c# winforms singleton

我有一个webform(c#)应用程序,它只能在单个实例中运行。同样重要的是,如果再次启动应用程序(单击应用程序图标),则应将新参数转发到当前实例,但现在应用程序将启动。

我有问题google问题并发现:http://www.sanity-free.com/143/csharp_dotnet_single_instance_application.html

到目前为止,这是我设置的方式:

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);
             }
        }
}

这个问题是我第二次尝试启动程序时,我会在_instance为null的else中得到一个异常吗?

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

.NET程序集Microsoft.VisualBasic.dll包含一个名为WindowsFormsApplicationBase的类。这个也可以被C#应用程序使用,并且有一个名为IsSingleInstance的属性,可以设置它来实现所需的行为。

首次启动应用程序时,您可以注册事件处理程序以进一步启动应用程序。从事件args中,您可以提取每个额外启动的命令行参数。

查看示例here

答案 1 :(得分:1)

在这种情况下,它是一个进程间通信(IPC),所以_instance没有意义。如果你想拥有IPC,还有一些方法可以做:socket,namepiped,messaging ......

我认为有两种方法适合:

  1. 按流程名称获取上一个流程 - >调用P / Invoke EnumWindows方法获取主窗口句柄。发送带有ID的消息之前已经注册了RegisterWindowMessage,以传递参数。
  2. 创建一个namedpipe服务器以侦听新进程的参数。