zoukankan      html  css  js  c++  java
  • 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_ROOTgr]",
             "@="Open gr"",
             ""URL Protocol"=""",
             "",
             "[HKEY_CLASSES_ROOTgrshell]",
             "",
             "[HKEY_CLASSES_ROOTgrshellopen]",
             "",
             "[HKEY_CLASSES_ROOTgrshellopencommand]",
             "",
             "@=""%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_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment
            /// </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(@"SystemCurrentControlSetControlSession ManagerEnvironment", 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;
                }
            }
  • 相关阅读:
    CoreData和SQLite多线程访问时的线程安全问题
    JSPatch 实现原理详解
    iOS开发工程师必备技能(持续更新)
    iOS音频播放、录音、视频播放、拍照、视频录制
    使用MVVM减少控制器代码实战(减少56%)
    如何结合场景利用block进行回调
    Masonry框架源码深度解析
    Ubantu编译安装FFmpeg
    HTTP Live Streaming网络视频直播调研
    RHEL/CentOS 6的更新源
  • 原文地址:https://www.cnblogs.com/Dinnerbone/p/13832253.html
Copyright © 2011-2022 走看看