如何从 .NET 程序打开 Web 浏览器? Process.Start() 不起作用?
Posted
技术标签:
【中文标题】如何从 .NET 程序打开 Web 浏览器? Process.Start() 不起作用?【英文标题】:How do I open a web browser from a .NET Program? Process.Start() isn't working? 【发布时间】:2011-02-17 06:54:46 【问题描述】:我有一个 URL,我想在默认浏览器中启动它。我试过两种方法:
Process.Start("http://***.com");
...以及在此other question 中详细介绍的使用 ShellExecute。
在这两种情况下,我都会收到错误消息:Windows 找不到“http://***.com”。请确保您输入的名称正确,然后重试。
它不应该尝试将其作为文件打开...据我了解,它应该将其识别为 URL 并在默认浏览器中打开它。我错过了什么?
顺便说一句:OS = Vista,.NET = 3.5
编辑:
根据this MS KB article,由于 Process.Start 默认设置了 UseShellExecute,它应该启动默认浏览器。
编辑:
以下是有效的:
System.Diagnostics.Process.Start(@"C:\Program Files\Internet Explorer\IExplore.exe", "http://***.com");
不幸的是,它确实没有启动默认浏览器,如果 IE 没有安装在“正常”位置,它也不起作用。我不确定在这里做什么。
更多信息:
好的,所以我得到的错误是错误号-2147467259。看看谷歌,它似乎不是很有描述性。可能是文件关联错误之类的。
情节变厚:
所以我检查了应该与我的 http 文件关联的注册表项:
KEY_CLASSES_ROOT\http\shell\open\command\default
这是价值:
"C:\Program Files\Mozilla Firefox\firefox.exe" -requestPending -osint -url "%1"
这是有道理的。我实际上将此字符串复制到命令提示符中并将 %1 替换为 http://***.com 并且它工作并打开了 Firefox。我只是不明白为什么 Process.Start 没有将 URL 与此命令相关联...
【问题讨论】:
我想知道它是否适用于包括文件名和扩展名在内的 URL 更好?试试“msdn.microsoft.com/en-us/default.aspx”。 顺便说一句,不要硬编码“程序文件”,因为如果windows版本不是英文的,那就不同了。 @M28:这就是我说的,不是吗? 您在什么凭据下运行? @Jeremy McGee:它是 Vista Home Premium,我是管理员,但应用程序没有在提升的权限下执行。 【参考方案1】:试试
Process.Start("IExplore.exe http://www.***.com");
这将启动 Internet Explorer 和 URL。 Process.Start 不会自动检测应用程序/浏览器。y
【讨论】:
我认为这是一种不好的做法。如果有更简单、更好的方法,请不要以如此粗暴的方式依赖 IE。 那么默认浏览器位置在注册表中,您可以检索进程值以启动。 @Russel:是的,请参阅我问题的后半部分。好像是对的,Process.Start 应该是用的,其实不然。【参考方案2】:这是我在 Firefox 是默认网络浏览器时看到的一个严重问题。
如果我们使用 System.Windows.Forms.Help.ShowHelp(null, "http://microsoft.com"),这样的错误信息可以在 Windows 上解决。但是,在 Mono/openSUSE 上,Help.ShowHelp 无法正常工作。
【讨论】:
【参考方案3】:好的,所以它神秘地开始正常工作而没有改变任何东西。我无法解释。但是,与此同时,我编写了另一种查找和执行默认浏览器的方法。这有点hacky,但比默认加载IE要好得多:
bool success = false;
RegistryKey httpKey = Registry.ClassesRoot.OpenSubKey(@"http\shell\open\command");
if (httpKey != null && httpKey.GetValue(string.Empty) != null)
string cmd = httpKey.GetValue(string.Empty) as string;
if (cmd != null)
try
if (cmd.Length > 0)
string[] splitStr;
string fileName;
string args;
if (cmd.Substring(0,1) == "\"")
splitStr = cmd.Split(new string[] "\" " , StringSplitOptions.None);
fileName = splitStr[0] + "\"";
args = cmd.Substring(splitStr[0].Length + 2);
else
splitStr = cmd.Split(new string[] " " , StringSplitOptions.None);
fileName = splitStr[0];
args = cmd.Substring(splitStr[0].Length + 1);
System.Diagnostics.Process.Start(fileName, args.Replace("%1","http://***.com"));
success = true;
catch (Exception)
success = false;
httpKey.Close();
【讨论】:
使用 ProcessInfo 的解决方案虽然更合乎逻辑,但并不总是有效 - 这个效果很好,但例如在 Windows 7 上(其他解决方案不起作用)。为了使其也能在 Windows 10 上运行(使用 ProcessINfo 的其他解决方案可能实际运行),您应该检查 HKCU\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice 注册表项 - ProgId 的值应该指向 HKCR 条目,而不是上面的默认“http”【参考方案4】:这对我有用:
Process proc = new Process ();
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.FileName = "http://***.com";
proc.Start ();
如果您想使用自动识别命令类型(在本例中为 http/浏览器),请不要忘记 UseShellExecute。
编辑:如果您Win+R
url 是否有效?
【讨论】:
这与我使用的方法相同。只需调用 Process.Start 默认设置 UseShellExecute (请参阅我在问题中链接的知识库文章)。 确实,MSDN 也同意知识库文章。我糊涂了。这必须奏效。你的网址真的正确吗?默认浏览器设置?此答案中的代码是否有效或是否产生相同的消息?雷蒙德来救援! 它给出了相同的信息(这实际上是我首先尝试的代码)。我认为它必须是我机器上的文件关联问题。我正在想办法解决这个问题。 是的,这听起来像是一个合理的解释。很抱歉一开始没有彻底阅读这个问题,顺便说一句,你解释得很好。 :) 你有没有想过把这个问题放在 SU 上?以上是关于如何从 .NET 程序打开 Web 浏览器? Process.Start() 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
优雅地停止ASP.NET Core Web App(从Visual Studio调试器中),这是一个与IHostedService相关的问题
如何在 Asp.net MVC 中添加 Web Api,然后在同一个应用程序中使用 WebAPI