【问题标题】:How do I open a web browser from a .NET Program? Process.Start() isn't working?如何从 .NET 程序打开 Web 浏览器? Process.Start() 不起作用?
【发布时间】:2011-02-17 06:54:46
【问题描述】:

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

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

...以及在此other question 中详细介绍的使用 ShellExecute。

在这两种情况下,我都会收到错误消息:Windows 找不到“http://stackoverflow.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://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 更好?试试“msdn.microsoft.com/en-us/default.aspx”。
  • 顺便说一句,不要硬编码“程序文件”,因为如果windows版本不是英文的,那就不同了。
  • @M28:这就是我说的,不是吗?
  • 您在什么凭据下运行?
  • @Jeremy McGee:它是 Vista Home Premium,我是管理员,但应用程序没有在提升的权限下执行。

标签: c# url browser process


【解决方案1】:

试试

Process.Start("IExplore.exe http://www.stackoverflow.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://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”
    【解决方案4】:

    这对我有用:

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

    如果您想使用自动识别命令类型(在本例中为 http/浏览器),请不要忘记 UseShellExecute

    编辑:如果您Win+R url 是否有效?

    【讨论】:

    • 这与我使用的方法相同。只需调用 Process.Start 默认设置 UseShellExecute (请参阅我在问题中链接的知识库文章)。
    • 确实,MSDN 也同意知识库文章。我糊涂了。这必须奏效。你的网址真的正确吗?默认浏览器设置?此答案中的代码是否有效或是否产生相同的消息?雷蒙德来救援!
    • 它给出了相同的信息(这实际上是我首先尝试的代码)。我认为它必须是我机器上的文件关联问题。我正在想办法解决这个问题。
    • 是的,这听起来像是一个合理的解释。很抱歉一开始没有彻底阅读这个问题,顺便说一句,你解释得很好。 :)
    • 你有没有想过把这个问题放在 SU 上?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2014-05-29
    • 2021-10-26
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多