2

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

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

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

string processName = Path.GetFileNameWithoutExtension(
    Assembly.GetEntryAssembly().Location);

if(Process.GetProcessesByName(processName).Count() > 1) 
    return;

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

4

4 回答 4

4

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

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

于 2013-06-23T17:18:28.067 回答
3

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

此方案由程序集中 .NET Framework 提供的基础结构类支持Microsoft.VisualBasic.dll,更具体地说,由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();
        }
    }
}
于 2013-06-23T18:38:49.080 回答
0

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

于 2013-06-23T17:18:20.927 回答
0

有几种方法可以在两个进程之间进行通信。

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

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

...

通过'check-if-instance-is-already-running'后,您将启动一个正在等待外部调用的侦听器。如果检查失败,则启动客户端调用传递参数的侦听器。这样,您还可以让托盘图标发送例如播放/暂停命令到您的应用程序。

于 2013-06-23T17:18:49.647 回答