如何从 .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

如何从我的应用程序中打开网页?

.NET WEB API 使用 FTP 在新的浏览器选项卡中打开图像文件

如何在 Web 应用程序中制作实时并发锁? [关闭]

如何从 SAP HTML 查看器打开 javascript 开发者控制台