C# 如何通过浏览器外部启动应用程序 (可传参)

本文以Windows系统为例,其他系统根据环境如法炮制。

引子:

我们经常能看见一些网站可以启动本机的应用程序,我们点击网页的一个按钮后就会被重定向到一个新地址并应用程序,甚至可通过解析重定向地址内含的参数帮你实现自动化操作应用程序。

而这些网址的协议往往不是http,而是你没见过的新协议。所以我们今天搞懂这是如何实现的。

 

思路:

既然是新协议,那么肯定是有应用程序向系统配置文件定义了这个新协议,而定义方法正是通过注册表。

注册表内创建新的URL Protocol并使用Shell来启动应用程序,这样定义注册表后,那么浏览器就可通过该协议打开应用程序了。

但有一个问题,注册表写的启动路径是绝对路径,这并不适合部署到客户那边...

对,你可能已经想到了解决方案,那就是根据应用程序的路径,动态创建一个新的环境变量,然后把环境变量也注册到系统里。

然后注册表的应用程序路径使用这个环境变量就大功告成了!!

 

代码实现:

导入注册表:

 

//执行注册 构造函数 public void ExecuteReg(string path) { if (File.Exists(path)) //如果注册表文件存在,则实现如下命令 { //路径变换 path = @"""" + path + @""""; //启动regedit.exe程序并导入注册表 Process.Start("regedit", string.Format(" /s {0}", path)); } }

 

创建注册表:

public void Writer(string savePath) { string[] names = new string[] { "Windows Registry Editor Version 5.00", "", "[HKEY_CLASSES_ROOT\gr]", "@="Open gr"", ""URL Protocol"=""", "", "[HKEY_CLASSES_ROOT\gr\shell]", "", "[HKEY_CLASSES_ROOT\gr\shell\open]", "", "[HKEY_CLASSES_ROOT\gr\shell\open\command]", "", "@="\"%ROOT%\\名字.exe\" \"%LAUNCH_FLAGS%\""" }; using (StreamWriter sw = new StreamWriter(savePath + "startup.reg")) { foreach (string s in names) { sw.WriteLine(s); } } }

设置环境变量:

public static string GetSysEnvironmentByName(string key) { string result = string.Empty; try { result = OpenSysEnvironment().GetValue(key).ToString(); } catch (Exception) { return result; } return result; } /// <summary> /// 获得RegistryKey,值为 /// HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment /// </summary> /// <returns></returns> public static RegistryKey OpenSysEnvironment() { RegistryKey regLocalMachine = Registry.LocalMachine; RegistryKey regSystem = regLocalMachine.OpenSubKey("System", true); RegistryKey regControlSet = regSystem.OpenSubKey("CurrentControlSet", true).OpenSubKey("Control",true).OpenSubKey("Session Manager",true); RegistryKey regEnvironment = regLocalMachine.OpenSubKey(@"System\CurrentControlSet\Control\Session Manager\Environment", true); return regEnvironment; } public static string SetSysEnvironment(string key, string strValue) { string pathList = null; if (CheckSysEnvironmentExist(key) == false) { OpenSysEnvironment().SetValue(key, strValue); } else { pathList = GetSysEnvironmentByName(key); if (pathList.Contains(strValue)) { } if (!pathList.EndsWith(";")) { OpenSysEnvironment().SetValue(key, pathList + ";"); pathList = GetSysEnvironmentByName(key); } else { OpenSysEnvironment().SetValue(key, pathList + strValue); } } } /// 检测系统环境变量是否存在 public static Boolean CheckSysEnvironmentExist(string key) { if (!string.IsNullOrEmpty(GetSysEnvironmentByName(key))) { return true; } else { return false; } }

 


__EOF__

本文作者田所浩托的随笔一记
本文链接https://www.cnblogs.com/Dinnerbone/p/13832253.html
关于博主:hello~好久不见,喜欢的话点个赞吧
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   田所浩托TrosuoTro  阅读(906)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示