当我第二次打开应用程序时,如何将参数发送到已经运行的应用程序

本文关键字:应用程序 参数 运行 第二次 | 更新日期: 2023-09-27 18:19:46

我正在尝试创建一个音乐播放器。

当我点击一个mp3文件时,它会在我的应用程序中打开,但当我点击另一个mp3文件时,会再次打开应用程序。我需要代码来检查应用程序是否已经在运行,如果是,不要打开新的应用程序,并将新mp3文件的名称发送到已经打开的应用程序中。

我使用以下代码来检查应用程序是否正在运行:

string processName = Path.GetFileNameWithoutExtension(
    Assembly.GetEntryAssembly().Location);
if(Process.GetProcessesByName(processName).Count() > 1) 
    return;

现在我需要将新的mp3文件路径发送到已经运行的应用程序中。例如,Windows Media Player和Gom Player都具有此功能。

当我第二次打开应用程序时,如何将参数发送到已经运行的应用程序

我建议使用命名互斥,而不是GetProcessesByName。不管怎样,如果你得到了互斥,启动一个远程处理服务器。如果你没有得到互斥,启动一个远程客户端,连接到该服务器(第一个运行的应用程序),并用它来调用服务器上的方法。

这里有一个MSDN示例:http://msdn.microsoft.com/en-us/library/ms771662(v=VS.90).aspx

我假设是Windows窗体应用程序,所以您试图实现的是一个单实例应用程序,它可以被通知应用程序的后续启动,而不是生成一个新的应用程序实例来处理新文件本身的打开。

此场景由Microsoft.VisualBasic.dll程序集中的.NET Framework提供的基础结构类支持,更具体地说,由WindowsFormsApplicationBase类支持。不要被这个名字骗了,你也可以在C#中使用它,没有任何问题。我在下面的博客文章中写到了这个场景:

单实例Windows窗体应用程序

您可以完全阅读它来查看完整的示例,但重要的部分是以下代码片段,您可以在其中处理直接在第一个应用程序实例中传递给第二个实例的参数:

class SingleInstanceApp : WindowsFormsApplicationBase
{
    public SingleInstanceApp()
        : base()
    {
        this.IsSingleInstance = true;
    }
    protected override void OnStartupNextInstance(
        StartupNextInstanceEventArgs e)
    {
        base.OnStartupNextInstance(e);
        string[] secondInstanceArgumens = e.CommandLine.ToArray();
        // Handle command line arguments of second instance
        if (e.BringToForeground)
        {
            this.MainForm.BringToFront();
        }
    }
}

您可以通过多种方式在同一台机器上的应用程序之间进行混合。线程、WCF(使用正确的procotol)等。只要谷歌一下这些东西,你也可以做一些丑陋的事情,比如它写入文件的路径,然后主应用程序每1秒读取一个文件的相同位置。如果有(新mp3文件的)路径。主应用程序将播放它,然后删除路径并继续检查。

两个进程之间有几种通信方式。

.NET远程处理:http://msdn.microsoft.com/en-us/library/kwdt6w2k(v=vs.71).aspx

WCF:http://msdn.microsoft.com/en-us/library/dd456779.aspx

在通过"检查实例是否已在运行"之后,您将启动一个等待外部调用的侦听器。如果检查失败,则启动客户端,调用传递参数的侦听器。通过这种方式,您还可以使用托盘图标向应用程序发送例如播放/暂停命令。