【问题标题】:C# Open Same Application From Different Url and pass parametersC#从不同的Url打开相同的应用程序并传递参数
【发布时间】:2014-10-29 22:50:29
【问题描述】:

我的申请步骤是:

  1. 先进入设置页面,设置页面会在后台注册Registry Log(命令行中为'regedit')(可能很少有人进入设置页面)。
  2. 当用户点击网页中的 URL 时,会触发注册表并打开我的应用程序。
  3. 应用程序读取它获取的参数并根据参数值执行操作。
  4. 用户可以点击不同的链接向我的应用程序发送不同的参数
  5. 也就是说,如果应用程序没有打开,应该启动它并读取参数。如果应用程序已经打开,它应该只读取参数。

问题是:如何找出我的应用程序的不同情况——是否打开——然后正确使用参数?

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

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 读取注册表,

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

这是我第一次遇到这种用户要求的情况,

希望有人能给我任何方向!

提前致谢。

【问题讨论】:

    标签: c# registry startup pluggableprotocol


    【解决方案1】:

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

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

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

    Send/Receive message To/From two running application

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

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

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

    【讨论】:

      【解决方案2】:

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

      只需在Mutex 之前添加“静态”即可。

      查看详情:C# static

      【讨论】:

        猜你喜欢
        • 2012-12-23
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-28
        • 1970-01-01
        • 2011-06-02
        • 2022-07-07
        相关资源
        最近更新 更多