【问题标题】:How to send parameter to already running application when I open it second time?当我第二次打开它时如何将参数发送到已经运行的应用程序?
【发布时间】:2023-03-23 10:44:01
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# visual-studio


    【解决方案1】:

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

    Microsoft.VisualBasic.dll 程序集中的 .NET Framework 提供的基础结构类支持此方案,更具体地说,WindowsFormsApplicationBase 类支持此方案。不要被名称所迷惑,您也可以在 C# 中毫无问题地使用它。我在以下博客文章中写到了这种情况:

    Single Instance Windows Forms Application

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

    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();
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      .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”后,您将启动一个正在等待外部调用的侦听器。如果检查失败,则启动客户端调用传递参数的侦听器。这样你也可以拥有例如向您的应用程序发送例如播放/暂停命令的托盘图标。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 建议使用互斥锁应该优先于检查进程
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多