2

我有一个 WPF 应用程序,它可以采用一些可选的命令行参数。

这个应用程序也是一个单实例应用程序(如果一个实例已经打开,则使用互斥锁关闭任何实例)。

不过,我想要它做的是,如果某些东西试图用一些 cmd 行参数打开应用程序,那么应用程序将执行它应该对那些执行的操作(在我的应用程序中,它会根据 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);
}
4

4 回答 4

3

Code Project 上有很多单实例应用程序的实现,实际上它们太多了,很难决定你想要哪一个......

我尝试了几种解决方案,我真的很喜欢这个。它使拦截传递给第二个实例的命令行参数变得非常容易。

于 2010-12-27T20:11:36.333 回答
1

为什么不直接在 WM_USER 范围内发送一条 Windows 消息。您需要对信息进行一些编组,但您可以使用 GlobalAlloc、GlobalLock 等很容易地做到这一点。

于 2010-12-27T20:05:18.623 回答
0

如果您使用的是 .net 4,您可能会考虑使用内存映射文件进行进程间通信。第二个实例可以将一些数据写入共享内存,设置系统互斥锁以通知原始实例,然后关闭。请参阅内存映射文件的概述

或者,更简单的是,将命令行参数写入文件夹中的一个简单文本文件,该文件夹始终由原始实例监控。原始实例看到新文件,对其进行处理,然后将其删除。这种方法适用于任何版本的 .net,并且更容易测试/调试。

于 2010-12-27T20:06:21.930 回答
0

您可能希望考虑颠倒逻辑,即。关闭已经运行的实例并使用新参数重新启动。

于 2010-12-27T19:55:22.880 回答