如何在C#中向正在运行的进程发送参数?

时间:2015-03-16 15:06:38

标签: c# arguments single-instance

我使用Visual Studio 2012 Windows Form C#创建了一个音乐播放器。现在我希望用户能够使用我的播放器在Windows资源管理器中播放歌曲,例如其他播放器(Windows Media Player,Winamp等)。 我已经找到了文件关联的方法!

但是我需要阻止我的应用程序运行多个实例(如WMP& ...不要),我也希望获得歌曲Paths以将它们发送到我的应用程序(已经开始)。

例如,用户在Windows资源管理器和目录中的目录中选择3首歌曲。按Enter键,然后执行我的应用程序/并执行我的AddFiles功能(将支持的文件添加到播放列表中......)

我试过mutex它解决了第一部分(只是单个实例)但无法从中获取参数!

我也试过this但没有机会:(它给出了错误!

**我已经尝试What is the correct way to create a single instance application?“马特戴维斯”答案,它使我的应用程序只是单个实例并且带到前面部分很棒但是没有向我的运行过程发送参数所以它不能解决我的问题!

任何帮助都将提前:)

更新: 我不明白,虽然我没有解决我的问题为什么专家关闭这个问题!? :| :/

更新2(找到解决方案):

好吧最后我得到了解决方案:)

此链接帮助我通过单击上下文菜单项获取资源管理器中所选文件的路径: .NET Shell Extensions - Shell Context Menus

真的很容易:) 希望这也有助于其他人!

1 个答案:

答案 0 :(得分:1)

我用这个:https://code.msdn.microsoft.com/windowsapps/CSWinFormSingleInstanceApp-d1791628

它是单个实例,并支持命令行参数。我的程序是这样开始的:

[STAThread]
static void Main(String [] args) {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    Form1 mf = new Form1(); // your form
    SingleInstanceAppStarter.Start(mf, StartNewInstance);
}

...

private static void StartNewInstance(object sender, StartupNextInstanceEventArgs e) {
    String cmdArg = e.CommandLine[1]; // yes, 1 to get the first.  not zero.
    ...
}

你还需要这个:

class SingleInstanceAppStarter
{
    static SingleInstanceApp app = null;

    public static void Start(Form f, StartupNextInstanceEventHandler handler)
    {
        if (app == null && f != null)
        {
            app = new SingleInstanceApp(f);
        }
        app.StartupNextInstance += handler;
        app.Run(Environment.GetCommandLineArgs());
    }
}

和此:

class SingleInstanceApp : WindowsFormsApplicationBase
{
    public SingleInstanceApp() { }

    public SingleInstanceApp(Form f)
    {
        base.IsSingleInstance = true;
        this.MainForm = f;
    }
}

请注意,这两个类都使用Microsoft.VisualBasic.ApplicationServices程序集(您必须引用它)。