我正在尝试创建快速启动器应用程序并运行例如我使用的应用程序
Process.Start("chrome.exe");
但是,我希望应用程序检查该应用程序(chrome)是否存在,如果找不到,那么它将提示用户是否要更改查找chrome的路径以及是否按是文件资源管理器将显示,他们可以选择文件所在的位置。基本上,我正在尝试使其成为动态路径,而不是固定路径。有什么建议吗?
编辑:这个问题和链接的区别是,我更多地是在寻找如何使路径动态化,而不仅仅是文件的存在,如果找不到该文件,则将显示一个搜索窗口。让用户知道文件所在的位置,并因此更改代码中的路径。
答案 0 :(得分:2)
因此,如果您想知道Windows中是否安装了应用程序,可以在SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
下的注册表中迭代“可卸载的应用程序”
但是没有“安装”某些仅具有可执行文件的应用程序。
void Main()
{
if (GetInstalledApplications().Any(a => a == "Google Chrome"))
{
//Chrome is installed
}
}
public IEnumerable<string> GetInstalledApplications()
{
string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (var key = Registry.LocalMachine.OpenSubKey(registry_key))
{
foreach (var subkey_name in key.GetSubKeyNames())
{
using (var subkey = key.OpenSubKey(subkey_name))
{
yield return (string)subkey.GetValue("DisplayName");
}
}
}
}
如果要通过默认可执行文件名获取已安装的应用程序(并能够启动它),则可以迭代SOFTWARE\Microsoft\Windows\CurrentVersion\App paths
void Main()
{
var appPath = GetInstalledApplications()
.Where(p => p != null && p.EndsWith("Chrome.exe", StringComparison.OrdinalIgnoreCase))
.FirstOrDefault();
if(appPath != null)
{
//Launch
}
}
public IEnumerable<string> GetInstalledApplications()
{
string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App paths";
using (var key = Registry.LocalMachine.OpenSubKey(registry_key))
{
foreach (var subkey_name in key.GetSubKeyNames())
{
using (var subkey = key.OpenSubKey(subkey_name))
{
yield return (string)subkey.GetValue("");
}
}
}
}
使用此解决方案,您可以使用搜索下拉列表并返回GetInstalledApplications
的结果,以帮助用户选择正确的程序,而不必依靠他们知道正确的文件名。
答案 1 :(得分:0)
以下代码有效。请检查相同。我创建了一个示例Windows应用程序,并对其进行了测试。它正在工作。
Process process = new Process();
try
{
// Configure the process using the StartInfo properties.
process.StartInfo.FileName = "chrome1.exe";
process.StartInfo.Arguments = "-n";
process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
process.Start();
process.WaitForExit();// Waits here for the process to exit.
}
catch (Win32Exception ex)
{
if (ex.Message.Equals("The system cannot find the file specified"))
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
process.StartInfo.FileName = openFileDialog1.FileName;
process.Start();
}
}
}