很多软件安装位置不一样,但是他们基本上会在注册表的同一个位置写下自己的名字和程序路径,这个位置是:

  HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionApp Paths

  所以只要去这个地方找软件路径可以了。

  你可以添加你知道的正确的文件名,是它在注册表中的名字。比如office word在注册表中叫winword

  终拿到的是那个exe的完全路径,如果要文件夹的话用Path.GetDirectoryName()行了

public enum Softwares
{
//The names are the same with the registry names.
//You can add any software exists in the "regedit" path:
//HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionApp Paths
EXCEL,      //Office Excel
WINWORD,    //Office Word
MSACCESS,   //Office Access
POWERPNT,   //Office PowerPoint
OUTLOOK,    //Office Outlook
INFOPATH,   //Office InfoPath
MSPUB,      //Office Publisher
VISIO,      //Office Visio
IEXPLORE,   //IE
ITUNES      //Apple ITunes
//.........
}
public class SoftwareOperator
{
//When you do not want to use string name, then use the Enum instead
public static bool TryGetSoftwarePath(Softwares softName, out string path)
{
return TryGetSoftwarePath(softName.ToString(), out path);
}
public static bool TryGetSoftwarePath(string softName, out string path)
{
string strPathResult = string.Empty;
string strKeyName = "";     //"(Default)" key, which contains the intalled path
object objResult = null;
Microsoft.Win32.RegistryValueKind regValueKind;
Microsoft.Win32.RegistryKey regKey = null;
Microsoft.Win32.RegistryKey regSubKey = null;
try
{
//Read the key
regKey = Microsoft.Win32.Registry.LocalMachine;
regSubKey = regKey.OpenSubKey(@"SOFTWAREMicrosoftWindowsCurrentVersionApp Paths" + softName.ToString() + ".exe", false);
//Read the path
objResult = regSubKey.GetValue(strKeyName);
regValueKind = regSubKey.GetValueKind(strKeyName);
//Set the path
if (regValueKind == Microsoft.Win32.RegistryValueKind.String)
{
strPathResult = objResult.ToString();
}
}
catch (System.Security.SecurityException ex)
{
throw new System.Security.SecurityException("You have no right to read the registry!", ex);
}
catch (Exception ex)
{
throw new Exception("Reading registry error!", ex);
}
finally
{
if (regKey != null)
{
regKey.Close();
regKey = null;
}
if (regSubKey != null)
{
regSubKey.Close();
regSubKey = null;
}
}
if (strPathResult != string.Empty)
{
//Found
path = strPathResult;
return true;
}
else
{
//Not found
path = null;
return false;
}
}
}