C# 获取程序安装目录

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

首先将注册信息创建一个注册表文件 .reg 格式,以页面启动 notepad++ 程序为例

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();
                                }
                            }
                        }
                    }
                }
            }
        }

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

C# 获取程序安装目录,布布扣,bubuko.com

时间: 2024-10-23 08:34:55

C# 获取程序安装目录的相关文章

[转] C# 获取程序运行目录

来自 莫等闲也,原文 // 获取程序的基目录.  System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName // 获取和设置当前目录(该进程从中启动的目录)的完全限定目录. System.Environment.CurrentDirectory // 获取应用程序的当前工作目录. System.IO.Di

Python获取程序运行目录和脚本目录

import os import sys #获取脚本所在目录 print os.path.split( os.path.realpath( sys.argv[0] ) )[0] #获取脚本运行目录 print os.getcwd() 在脚本所在目录运行: python test.py /home/Hadoop /home/hadoop 在其他目录运行:python hadoop/test.py /home/hadoop /home

Inno Setup中做补丁通过注册表获取原程序安装目录

今天找VM补丁看到的,是个innosetup封装的,所以习惯性的喜欢去看人家的iss文件是怎么编写的. DefaultDirName={reg:HKLM\SOFTWARE\VMware%2c%20Inc%2E\VMware Workstation,InstallPath} 看到上面这个代码很奇怪,DefaultDirName是默认安装路径,他的路径是以reg开始的,大意是注册表的路径,后面加了个InstallPath,这样就搞定了,真简单,这个我以前是不知道,不过以后就可以用到了,哈哈. 这个包

C#获取程序所在目录路径

方法1:Directory.GetCurrentDirectory().这个方法只能在.NET的完整版中使用,NETCF中不支持该功能,调用时会引发异常.获取的是当前目录,并不一定是真正的路径,跟OpenFile对话框有关联.  不推荐使用. 方法2: System.Windows.Forms.Application.StartupPath 这个方法只能在.NET的完整版中使用,NETCF中不支持该功能,调用时会引发异常. 获取运行程序的路径. 推荐使用 方法3:System.IO.Path.G

C# 获取程序运行目录

string a = "BaseDirectory:" + AppDomain.CurrentDomain.BaseDirectory + "\r\n" + "MainModule:" + Process.GetCurrentProcess().MainModule.FileName + "\r\n" + "ApplicationBase:" + AppDomain.CurrentDomain.SetupI

Android NDK开发(九)——应用监听自身卸载升级版,使用Inotify监听安装目录

转载请注明出处:http://blog.csdn.net/allen315410/article/details/42555415 在上一篇博客中,我们讲了一个小小的案例,用NDK监听应用程序自身卸载,并且打开内置浏览器加载用户调用页面.关于监听应用程序自身卸载的原理和实现方案可以在上篇博客中找到,地址是:http://blog.csdn.net/allen315410/article/details/42521251,这里就不再复述了. 值得注意的是,在上篇博客中我也已经引述了一个案例中存在的

Android之——获取手机安装的应用程序

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47114331 前几篇有关Android的博文中,向大家介绍了几个项目中常用的实用功能,那么在这篇博文中,我将向大家介绍如何获取Android手机中已经安装的手机应用程序,实用过金山手机卫士或者360手机卫士的童鞋都知道,这些软件都可以获取到当前手机中安装的应用程序.那么,这些功能是如何实现的呢?就让我们一起来看看这些功能具体是如何实现的吧. 一.原理 原理很简单,我们通过Andr

[Windows]_[MacOSX]_[获取程序的执行文件所在路径(目录)]

场景: 1. 有时候有些辅助程序文件需要放在主程序文件同样的位置,便于管理和调用,这时候就需要通过主程序的路径来获取辅助程序所在位置. 2. 或者通过执行文件地址获取程序目录的安装地址. 方案: 1. 这里列出来省的大家去费神去找了. Windows实现: Unicode2Utf8实现搜博客里有- #include <Windows.h> #include <shlwapi.h> std::string GetExeDir() { static wchar_t szbuf[MAX_

C#获取当前程序运行目录大全

Winform获取应用程序的当前路径的方法集合,具体如下,值得收藏 //获取当前进程的完整路径,包含文件名(进程名). string str = this.GetType().Assembly.Location; result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名) //获取新的Process 组件并将其与当前活动的进程关联的主模块的完整路径,包含文件名(进程名). string str = System.Diagnostics.Process.Get