如何从.NET程序中打开一个网页浏览器?Process.Start()无法工作?

15

我有一个URL,想在默认浏览器中启动它。我已经尝试了两种方法:

Process.Start("http://stackoverflow.com");

...并且在另一个问题中详细说明如何使用ShellExecute。

无论是哪种情况,我都会收到错误消息:“Windows无法找到'http://stackoverflow.com'。请确保您正确输入名称,然后重试。”

但它不应该尝试将其作为文件打开...根据我的理解,它应该将其识别为URL并在默认浏览器中打开。我漏掉了什么吗?

顺便说一下:操作系统=Vista,.NET=3.5

编辑

根据这篇MS KB文章,由于Process.Start默认设置了UseShellExecute,因此它应该启动默认浏览器。

编辑

以下是有效的方法:

System.Diagnostics.Process.Start(@"C:\Program Files\Internet Explorer\IExplore.exe", "http://stackoverflow.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://stackoverflow.com,它就可以打开Firefox了。我只是不明白为什么Process.Start没有将URL与这个命令关联起来...


我想知道对于包含文件名和扩展名的URL是否能够更好地工作?请尝试使用“http://msdn.microsoft.com/en-us/default.aspx”。 - John Saunders
顺便提一下,不要硬编码“Program Files”,因为如果Windows版本不是英语,它会有所不同。 - user216441
@M28:这不就是我说的吗? - Scott Whitlock
你是以什么凭据运行的? - Jeremy McGee
@Jeremy McGee:我的电脑是Vista Home Premium版本,我是管理员,但该应用程序未在提升的权限下执行。 - Scott Whitlock
请查看此线程:https://dev59.com/t2w15IYBdhLWcg3wcbSy - STiTCHiCKED
4个回答

12

这对我有用:

Process proc = new Process ();
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.FileName = "http://stackoverflow.com";
proc.Start ();

如果你想使用自动识别命令类型(在这种情况下是http /浏览器),请不要忘记使用UseShellExecute

编辑:如果你使用Win+R输入URL,它能起作用吗?


这与我正在使用的方法完全相同。只需调用Process.Start默认设置UseShellExecute(请参阅我在问题中提供的KB文章)。 - Scott Whitlock
事实上,MSDN也支持KB文章的观点。我很困惑。这一定要行。你的URL真的正确吗?默认浏览器设置好了吗?此答案中的代码是否有效或结果相同?Raymond来帮忙了! - mafu
它给出了相同的消息(实际上这是我先尝试的代码)。我想这可能是我的机器上的文件关联问题。我正在尝试弄清楚如何解决这个问题。 - Scott Whitlock
是的,那听起来像是一个合理的解释。顺便说一下,我一开始没有仔细阅读问题,你解释得很好。 :) - mafu
谢谢,问题解决了!我只是不知道为什么 "Process.Start("Url");" 没有起作用,你有什么想法吗? - Luan Cardoso
显示剩余2条评论

1
尝试。
Process.Start("IExplore.exe http://www.stackoverflow.com");

这将启动Internet Explorer和URL。Process.Start无法自动检测应用程序/浏览器。


3
我认为这是一种不好的做法。如果有一种更简单、更好的方法,就不要以如此粗糙的方式依赖IE。 - mafu
默认浏览器位置在注册表中,您可以检索进程值以启动。 - Russell
@Russel:是的,请看我问题的后半部分。它似乎是正确的,而Process.Start应该使用它,但它没有。 - Scott Whitlock

1

好的,所以它神奇地开始正常工作了,没有任何更改。我无法解释。但与此同时,我编写了另一种找到并执行默认浏览器的方法。它有点 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://stackoverflow.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” - hello_earth

1

这是一个严重的问题,我发现在 Firefox 是默认的 Web 浏览器时出现。

如果我们在 Windows 上使用 System.Windows.Forms.Help.ShowHelp(null, "http://microsoft.com"),就可以解决这个错误消息。然而,在 Mono/openSUSE 上,Help.ShowHelp 的效果不如预期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接