单个的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是空的?
我在这里做错了什么?
. net程序集Microsoft.VisualBasic.dll
包含一个名为WindowsFormsApplicationBase的类。这个也可以被c#应用程序使用,并且有一个名为IsSingleInstance
的属性,可以设置它来实现所需的行为。
在第一次应用程序启动时,您可以为以后的应用程序启动注册一个事件处理程序。从事件参数中,您可以提取每个额外启动的命令行参数。
在这种情况下,它是进程间通信(IPC),所以_instance没有意义。如果你想要IPC,有一些方法可以做到:socket, namepped, messaging…
我认为有两种方法是合适的:
- 通过进程名获取前一个进程->调用P/Invoke EnumWindows方法获取主窗口句柄。发送一个之前注册过RegisterWindowMessage的ID的消息,用来传递参数。
- 创建一个namedpipe服务器来监听新进程的参数。