我的申请步骤是:
- 先进入设置页面,设置页面会在后台注册Registry Log(命令行中为'regedit')(一般人很少会进入设置页面)。
- 当用户单击网页中的 URL 时,它将触发注册表并打开我的应用程序。
- 应用程序读取它获取的参数并根据参数值执行操作。
- 用户可以点击不同的链接向我的应用程序发送不同的参数
- 也就是说,如果应用程序没有打开,应该启动它并读取参数。如果应用程序已经打开,它应该只读取参数。
问题是:如何找出我的应用程序的不同情况-是否打开-然后正确使用参数?
注册表部分(在设置页面):
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
在我的应用程序启动时读取注册表,
使用计时器每秒读取注册表值......
这是我第一次面对这种用户要求的情况,
希望有人能给我任何方向!
提前致谢。