程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 獲取程序安裝目錄,

C# 獲取程序安裝目錄,

編輯:C#入門知識

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語言中 ^怎使用

a1 = 0x01; //0000 0001
a2 = 0x00; //0000 0000
a3 = 0x03; //0000 0011
a4 = 0x02; //0000 0010

b1 = a1 ^ a2; //0000 0001
b2 = a1 ^ a3; //0000 0010
b3 = a1 ^ a4; //0000 0011

^異或運算符,位值相同為0,不同為1,見上示例.

//
簡單實際問題舉例:
======\=======\=======
======a=======b=======
上面是2條電路,2個開關分別為a和b,打開狀態:\[1],關閉狀態:/[0].
若同時打開或者關閉,兩條電路均不通.
若a打開[1],b關閉[0],電路1通電
======\=======/=======
若a關閉[0],b打開[1],電路2通電
======/=======\=======
綜上,電路在a,b狀態相同時不通[0],在a,b不同時通電[1].
 

C語言中 ^怎使用

a1 = 0x01; //0000 0001
a2 = 0x00; //0000 0000
a3 = 0x03; //0000 0011
a4 = 0x02; //0000 0010

b1 = a1 ^ a2; //0000 0001
b2 = a1 ^ a3; //0000 0010
b3 = a1 ^ a4; //0000 0011

^異或運算符,位值相同為0,不同為1,見上示例.

//
簡單實際問題舉例:
======\=======\=======
======a=======b=======
上面是2條電路,2個開關分別為a和b,打開狀態:\[1],關閉狀態:/[0].
若同時打開或者關閉,兩條電路均不通.
若a打開[1],b關閉[0],電路1通電
======\=======/=======
若a關閉[0],b打開[1],電路2通電
======/=======\=======
綜上,電路在a,b狀態相同時不通[0],在a,b不同時通電[1].
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved