我有一个WPF应用程序可以使用一些可选的命令行参数。
此应用程序也是单实例应用程序(使用互斥锁关闭任何已打开的实例)。
我想做的事情是,如果某些东西试图用一些cmd行args打开应用程序,那么应用程序将执行它想要做的事情(在我的应用程序中它会根据cmd打开不同的对话框)线)。
实现这一目标的最简单方法是什么?
在psedo代码中,这里是我正在寻找的
protected override void OnStartup(StartupEventArgs e)
{
bool mutexIsNew;
using (System.Threading.Mutex m =
new System.Threading.Mutex(true, "MyApplication", out mutexIsNew))
{
//if this is not the first instance of the app
if (!mutexIsNew)
{
//if there is some cmd line args
if (e.Args.Length > 0)
{
//send the args to the older instance so it can handle them
SendToOtherInstance(e.Args);
//shutdown this new instance
Application.Current.Shutdown();
}
}
}
base.OnStartup(e);
}
答案 0 :(得分:3)
Code Project上有很多单实例应用程序的实现,实际上有很多这样的应用很难决定你想要哪一个......
我尝试了几种解决方案,我非常喜欢this one。它可以很容易地拦截传递给第二个实例的命令行参数。
答案 1 :(得分:1)
为什么不直接在WM_USER范围内发送Windows消息。您需要对信息进行一些编组,但您可以很容易地使用GlobalAlloc,GlobalLock等进行编组。
答案 2 :(得分:0)
您可能希望考虑颠倒逻辑,即。关闭已经运行的实例并使用新参数重新启动。
答案 3 :(得分:0)
如果您使用的是.net 4,则可以考虑使用内存映射文件进行进程间通信。第二个实例可以将一些数据写入共享内存,设置系统互斥锁以通知原始实例,然后关闭。请参阅此overview内存映射文件。
或者,更简单的是,将命令行参数写入始终由原始实例监视的文件夹中的简单文本文件。原始实例看到新文件,处理它,然后删除它。这种方法适用于任何版本的.net,更容易测试/调试。