【问题标题】:How to send arguments to a running Process in C#? [duplicate]如何在 C# 中向正在运行的进程发送参数? [复制]
【发布时间】:2015-05-18 18:24:08
【问题描述】:

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

但我需要阻止我的应用程序运行多个实例(因为 WMP 和...不要)并且我也想获取歌曲路径以将它们发送到我的应用程序(已经开始)。

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

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

我也尝试了this,但没有机会 :( 它出错了!

** 我已经尝试过What is the correct way to create a single instance application?“Matt Davis”的答案,它使我的应用程序仅是单个实例,并且放在前面非常棒,但没有向我的运行进程发送参数,所以它无法解决我的问题问题!

任何帮助都会提前:)

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

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

好的,我终于找到了解决方案:)

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

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

【问题讨论】:

  • 正如我所说,我已经尝试过那篇文章!它完成了我想要的一半工作!但不能解决参数部分(文件路径)
  • 或者我没有正确使用它!
  • 我试过“Matt Davis”回答它带到前窗的部分很棒我喜欢!但正如我所说,我无法通过它获得所有选定的文件路径! :(
  • “也许我没有正确使用它”——Matt Davis 的回答不支持参数传递。但是来自同一个问题的这个问题:stackoverflow.com/a/19326/3538012 还有很多其他方法可以处理参数传递,但您必须实现 some 机制。您的原始实例的 Main() 方法不会再次被调用,因此一旦程序启动,将命令行参数传递给程序需要您付出额外的努力。
  • 谢谢@PeterDuniho 我也要试试这个答案!但也许不是现在我真的很困&醒来后想睡觉试试看!希望它能解决我的问题

标签: c# arguments single-instance


【解决方案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 程序集(您必须引用它)。

【讨论】:

  • 我试过了,它在编译时显示错误:Win32 Exception is unhadled 创建窗口句柄时出错。
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 2022-01-07
  • 2011-10-08
相关资源
最近更新 更多