1

我的申请步骤是:

  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在我的应用程序启动时读取注册表,

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

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

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

提前致谢。

4

2 回答 2

1

Mutex当您发现应用程序的另一个实例已经在运行时(您在上面的代码中使用第二个应用实例。将参数传递给第一个应用程序实例的这段代码就在之前Environment.Exit(Environment.ExitCode);

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

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

向/从两个正在运行的应用程序发送/接收消息

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

这是一个不错的库,它展示了如何使用Memory mapped file.

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

于 2014-09-06T13:08:37.143 回答
0

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

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

查看详细信息:C# 静态

于 2014-09-09T01:43:26.647 回答