C# 获取程序安装目录_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C# 获取程序安装目录

C# 获取程序安装目录

 2014/8/13 18:37:07  Jetlian  程序员俱乐部  我要评论(0)
  • 摘要:在网页启动本地程序需要将命令写入注册表,在网页调用命令即可。首先将注册信息创建一个注册表文件.reg格式,以页面启动notepad++程序为例WindowsRegistryEditorVersion5
  • 标签:程序 C# 目录 安装

在网页启动本地程序需要将命令写入注册表,在网页调用命令即可。

 首先将注册信息创建一个注册表文件 .reg 格式,以页面启动 notepad++ 程序为例 
class="brush:csharp;gutter:true;">Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Webshell]
[HKEY_CLASSES_ROOT\Webshell\DefaultIcon]
[HKEY_CLASSES_ROOT\Webshell\shell]
[HKEY_CLASSES_ROOT\Webshell\shell\open]
[HKEY_CLASSES_ROOT\Webshell\shell\open\command]
@="\"C:\\Program Files (x86)\\Notepad++\\notepad++.exe\" \"%1\""

 

在页面调用HTML代码,会有一个外部请求的提示,直接启动应用即可。
<a href='Webshell://'>WebShell启动本地程序</a>    
    --------------------------------------分割线-----------------------------------------   在项目中,注册脚本不会让用户自己注册,那就需要将注册信息在程序中执行,用C#代码实现。  
    private static void Main(string[] args)
        {
       var notepadPath = @"C:\Program Files (x86)\Notepad++\notepad++.exe";
           CreateRegistryKey("Webshell", notepadPath);               
        }
        public static void CreateRegistryKey(string shell, string path)
        {
            RegistryKey key = Registry.ClassesRoot;
            key.CreateSubKey(shell);
            key.CreateSubKey(string.Format(@"{0}\DefaultIcon", shell));
            key.CreateSubKey(string.Format(@"{0}\shell", shell));
            key.CreateSubKey(string.Format(@"{0}\shell\open", shell));
            var command = key.CreateSubKey(string.Format(@"{0}\shell\open\command", shell));
            command.SetValue("", path);
            key.Close();
        }

 在真实的用户环境下,是不能确定某个程序安装在了哪里,所以程序的安装目录不能用固定的。

 百度一下,找到一个方法。 有的程序是可以找到,但有些程序就找不到了。不知道为什么?

        /// <summary>
        /// 获取单个程序的执行目录
        /// </summary>
        /// <param name="processName"></param>
        /// <returns></returns>
        public static string GetPath(string processName)
        {
            var process = Process.GetProcessesByName(processName);

            var path = string.Empty;//程序路径
            foreach (var p in process.Where(p => p.MainWindowHandle != IntPtr.Zero))
            {
                path = p.MainModule.FileName;
                break;
            }
            return path;
        }
        private static void Main(string[] args)
        {
         var notepadPath = GetPath("Notepad++"); Console.WriteLine(" 程序名称:Notepad++ \n 安装目录:" + notepadPath);      CreateRegistryKey("Webshell", notepadPath); }

 又百度一下,找到获取所有程序的安装目录方法,只是获取的安装路径,不是完整可用路径。

        /// <summary>
        /// 获取所有程序的安装目录
        /// </summary>
        public static void GetAllProcess()
        {
            const string Uninstall = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
            using (var registryKey = Registry.LocalMachine.OpenSubKey(Uninstall, false))
            {
                if (registryKey != null)//判断对象存在
                {
                    foreach (var keyName in registryKey.GetSubKeyNames())//遍历子项名称的字符串数组
                    {
                        using (var key = registryKey.OpenSubKey(keyName, false))//遍历子项节点
                        {
                            if (key != null)
                            {
                                var softwareName = key.GetValue("DisplayName", "").ToString();//获取软件名
                                var installLocation = key.GetValue("InstallLocation", "").ToString();//获取安装路径

                                if (!string.IsNullOrEmpty(installLocation))
                                {
                                    Console.WriteLine(softwareName);
                                    Console.WriteLine(installLocation);
                                    Console.WriteLine();
                                }
                            }
                        }
                    }
                }
            }
        }

 

最后,我是向大家请教问题的:怎么获取某个应用程序的安装路径,只通过程序名找?

 

   
上一篇: 如何搭建基于JDK1.5的分布式JAVA RMI 程序 下一篇: 没有下一篇了!
  • 相关文章
发表评论
用户名: 匿名