我想在安装.NET Windows Form application
期间或打开时检查第三方应用程序的安装情况。我的Windows窗体应用程序不需要运行第三方应用程序,但它确实需要它才能使功能正常工作。例如,My Windows Form应用程序打开第三方应用程序,例如邮件程序。
我不知道Click Once
是否是正确的策略?我需要它来检查安装过程中的先决条件,如果没有,则通知用户先安装它。如果Click Once
不是正确的策略,还有另一种方法吗?也许我需要首先安装我的Windows窗体应用程序,然后在打开它时检查第三方应用程序?问题是,安装路径可能因机器而异。我真的不确定如何解决这个问题。
此link解释了如何在Click Once中包含先决条件,但这不是我想要做的。
另一个link讨论了包含先决条件但不仅仅是检测它们。
答案 0 :(得分:1)
一种可能的解决方案是使用此方法检查注册表,该方法返回bool值,指示是否存在具有应用程序名称的注册表记录:
public static bool IsApplictionInstalled(string p_name)
{
string displayName;
RegistryKey key;
// search in: CurrentUser
key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// search in: LocalMachine_32
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// search in: LocalMachine_64
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// NOT FOUND
return false;
}