最近项目上有个需求,需要我们的C/S系统支持网页启动用于集成。百度下做法,最简单的莫过于利用ActiveX来直接启动了
类似于如下代码:
Process.Start("程序路径");
但是貌似只有IE支持这样的做法,而本身ActiveX也存在不少被阻止的问题,Chrome等浏览器也不再支持(需要自己下插件),考虑到通用性,只有利用更加广泛的Protocol
怎么理解我们自己做的这个Protocol呢,相当于Http,FTP,Https等,只不过我们这个是私有的,不具有广义上的广泛性。其实我们自己定义的协议,和Thunder和Steam的协议差不多,我们也有很多具有借鉴的地方。
模仿其结构,在HKEY_CLASSES_ROOT下创建自己的Protocol
创建自己的节点并定义Protocol名称
然后定义DefaultIcon节点
创建shell和open节点,下面值均是空,创建command节点,值为 “路径” "%1"
然后简单的html代码
<html>
<head>
<meta />
</head>
<body>
<div>
<a href="3DIICP.YLR://admin">
执行可执行文件
</a>
</div>
</body>
</html>
3DIICP.YLR是在HKEY_CLASSES_ROOT下创建的文件名,admin是参数(程序中接受到的参数是完整的href中的值,所以要提前做好字符串的解析)
实现效果如下
不幸的是,测试到现在,只有IE和Edge浏览器通过了测试。。。
当然,也可以通过代码来控制注册表的书写,引用点击打开链接
string programFullPath = string.Format(@"{0}\{1}", filePath, "Globe.EntryPoint.exe");//绝对路径
string nodeName = "3DIICP.YLR"; //节点名称 用于URL中调用 类似于http
string protocolName = "3DIICP.YLR.Protocol"; //protocol名称 随意取
RegistryKey key = Registry.ClassesRoot;
RegistryKey software = key.CreateSubKey(nodeName);
software.SetValue("URL Protocol", "");
software.SetValue("", protocolName);
RegistryKey softwareDefaultIcon = software.CreateSubKey("DefaultIcon");
softwareDefaultIcon.SetValue("", string.Format("{0}", programFullPath));
RegistryKey softwareShell = software.CreateSubKey("shell");
softwareShell = softwareShell.CreateSubKey("open");
softwareShell = softwareShell.CreateSubKey("command");
softwareShell.SetValue("", string.Format("{0} %{1}", programFullPath, "%1"));
Console.WriteLine("Protocol协议安装成功,按任意键继续...");
可以做一个控制台程序,权限问题很简单,引用文章中有描述,就不再赘述了