C#从不同Url打开同一应用程序并传递参数

C#从不同Url打开同一应用程序并传递参数,c#,registry,startup,pluggableprotocol,C#,Registry,Startup,Pluggableprotocol,我的申请步骤如下: 首先转到设置页面,设置页面将在后台注册注册表日志(在命令行中为“regedit”)(人们可能很少转到设置页面) 当用户单击网页中的URL时,它将触发注册表并打开我的应用程序 应用程序读取它获取的参数,并根据参数值执行操作 用户可以单击不同的链接向我的应用程序发送不同的参数 也就是说,如果应用程序未打开,则应启动它并读取参数。如果应用程序已经打开,它应该只读取参数 问题是:如何找出我的应用程序的不同情况(无论是否打开),然后正确使用参数 注册表部分(在设置页面中): %1是我将

我的申请步骤如下:

  • 首先转到设置页面,设置页面将在后台注册注册表日志(在命令行中为“regedit”)(人们可能很少转到设置页面)
  • 当用户单击网页中的URL时,它将触发注册表并打开我的应用程序
  • 应用程序读取它获取的参数,并根据参数值执行操作
  • 用户可以单击不同的链接向我的应用程序发送不同的参数
  • 也就是说,如果应用程序未打开,则应启动它并读取参数。如果应用程序已经打开,它应该只读取参数
  • 问题是:如何找出我的应用程序的不同情况(无论是否打开),然后正确使用参数

    注册表部分(在设置页面中):

    %1是我将获得的参数(从url到我的应用程序)

    而网页链接可能是:

    <a href="MyApp://function1">Call for Function 1</a>
    <a href="MyApp://function2">Call for Function 2</a>
    
    当应用程序打开时,是否可以将参数作为注册表方法发送

    我甚至想在应用程序启动时通过
    registry.GetValue
    读取注册表

    要使用计时器每秒读取注册表值

    这是我第一次面对用户的这种要求

    希望有人能给我任何方向


    提前感谢。

    当您发现应用程序的另一个实例已经在运行时(您可以在上面的代码中使用
    互斥体执行此操作),您可以通过编程方式将参数(第二个应用程序实例的)传递给第一个已经运行的应用程序实例,然后关闭第二个应用程序实例。用于将参数传递给第一个应用程序实例的代码将恰好位于
    Environment.Exit(Environment.ExitCode)之前

    (假设你的应用程序相对较小,在启动时不会加载很多库——在这种情况下,最好创建一个单独的小型启动程序应用程序)

    问题是,如何在两个独立进程之间传递参数-两个
    app.exe的实例。当然有几种选择,请看这里:

    我会使用
    FileWatcher
    Memory-mapped-file
    ,正如答案中指定的那样。 使用计时器和更改注册表值的解决方案不好(注册表操作需要管理员访问,注册表操作不是很快等等)

    这是一个很好的库,它展示了如何使用
    内存映射文件
    在两个进程之间传递参数


    我找到了另一种解决问题的方法

    只需在互斥对象之前添加“static”

    详情如下:

    <a href="MyApp://function1">Call for Function 1</a>
    <a href="MyApp://function2">Call for Function 2</a>
    
    Mutex mul = null;
    bool is_createdNew;
    try
    {
        string mutexName = Process.GetCurrentProcess().MainModule.FileName.Replace(Path.DirectorySeparatorChar, '_');
        mul = new Mutex(true, "Global\\" + mutexName, out is_createdNew);
        if (!is_createdNew)
        {
            // application be opened already, I close the application originally
            Environment.Exit(Environment.ExitCode);
        }
        else
        {
            // the application is first run, open my MainWindow
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
    }