我申请的步骤是:
问题是:怎样才能找出我的应用程序的不同情况 - 无论是否打开 - 然后正确使用参数?
注册表部分(在设置页面中):
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
阅读注册表,
使用计时器每秒读取注册表值......
这是我第一次面对用户请求的这种情况,
希望有人可以给我任何指导!提前致谢。
答案 0 :(得分:1)
当您发现应用程序的另一个实例已在运行时(您使用Mutex
在上面的代码中执行),您可以以编程方式将参数(第二个应用程序实例)传递给第一个,已经是运行应用程序实例,然后关闭第二个应用程序实例。用于将参数传递到第一个应用实例的代码将在Environment.Exit(Environment.ExitCode);
(假设您的应用程序相对较小,并且在启动时不会加载大量库 - 在这种情况下,最好创建一个单独的小型启动器应用程序)
问题是,如何在两个独立进程之间传递参数 - app.exe
的两个实例。当然有几种选择,请看这里:
Send/Receive message To/From two running application
我会使用该答案中指定的FileWatcher
或Memory mapped file
。
使用计时器和更改注册表值的解决方案并不好(注册表操作需要管理员访问权限,注册表操作不是那么快等等。)
这是一个很好的库,它显示了如何使用Memory mapped file
在两个进程之间传递参数。
http://code.msdn.microsoft.com/windowsdesktop/Inter-process-communication-e96e94e7
答案 1 :(得分:0)