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

本文关键字:参数 Winform 应用程序 单个 | 更新日期: 2023-09-27 18:08:54

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

我当然谷歌的问题,发现这个: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是空的?

我在这里做错了什么?

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

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

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

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

我认为有两种方法是合适的:

  1. 通过进程名获取前一个进程->调用P/Invoke EnumWindows方法获取主窗口句柄。发送一个之前注册过RegisterWindowMessage的ID的消息,用来传递参数。
  2. 创建一个namedpipe服务器来监听新进程的参数。