C#从不同的URL打开相同的应用程序并传递参数

时间:2014-09-05 03:19:37

标签: c# registry startup pluggableprotocol

我申请的步骤是:

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

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

    Registry.ClassesRoot.CreateSubKey("MyApp").SetValue("", "URL:MyApp Protocol");
    Registry.ClassesRoot.CreateSubKey("MyApp").SetValue("URL Protocol", "");
    Registry.ClassesRoot.CreateSubKey("MyApp\\DefaultIcon").SetValue("", "\"" + Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + "\\" + "MyApp.exe" + ",1\"");
    Registry.ClassesRoot.CreateSubKey("MyApp\\shell\\open\\command").SetValue("", "\"" + Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + "\\" + "MyApp.exe" + "\" \"%1\"");
    

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

    网络链接可能是:

    <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
    {
    }
    

    是否可以在打开应用程序时将参数作为注册表方法发送?

    我甚至考虑在我的应用程序启动时按Registry.GetValue阅读注册表,

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

    这是我第一次面对用户请求的这种情况,

    希望有人可以给我任何指导!

    提前致谢。

2 个答案:

答案 0 :(得分:1)

当您发现应用程序的另一个实例已在运行时(您使用Mutex在上面的代码中执行),您可以以编程方式将参数(第二个应用程序实例)传递给第一个,已经是运行应用程序实例,然后关闭第二个应用程序实例。用于将参数传递到第一个应用实例的代码将在Environment.Exit(Environment.ExitCode);

之前

(假设您的应用程序相对较小,并且在启动时不会加载大量库 - 在这种情况下,最好创建一个单独的小型启动器应用程序)

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

Send/Receive message To/From two running application

我会使用该答案中指定的FileWatcherMemory mapped file。 使用计时器和更改注册表值的解决方案并不好(注册表操作需要管理员访问权限,注册表操作不是那么快等等。)

这是一个很好的库,它显示了如何使用Memory mapped file在两个进程之间传递参数。

http://code.msdn.microsoft.com/windowsdesktop/Inter-process-communication-e96e94e7

答案 1 :(得分:0)

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

只需简单地添加静态&#39;在Mutex之前。

查看详细信息:C# static