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


Answers:


266
System.Diagnostics.Process.Start("http://www.webpage.com");

许多方式之一。


3
我也使用了它,但是现在事实证明这不适用于UAC。在我的应用程序中,我在清单<requestedExecutionLevel level =“ requireAdministrator” uiAccess =“ false” />中显示了此信息,当我在Windows 8(无法再禁用UAC)下运行该应用程序时,打开网页时出现以下异常:Win32Exception(0x80004005):未在System.Diagnostics.Process.StartWithShellExecuteEx上注册的类
lvmeijer 2012年

当我将requireAdministrator更改为asInvoker时,不会发生这种效果。但随后该应用程序未提升:-(
lvmeijer 2012年

4
如果您不小心从用户输入中获取URL而不验证它是URI,则可能在应用程序中打开一个很大的安全漏洞。然后,他们可以在系统上启动所需的任何应用程序。
cdiggins 2015年

1
仅供参考:在OS X和Windows上的Unity,Mono中均可使用。它在iOS中不起作用。我没有测试其他人。
Grant M

2
如何打开本地html文件?
guogangj

34

我一直在使用此行来启动默认浏览器:

System.Diagnostics.Process.Start("http://www.google.com"); 

1
这个答案是重复的。
MAXE

1
@MAXE这两个答案是在同一分钟内创建的。
4424dev


19

尽管给出了一个很好的答案(使用Process.Start),但是将其封装在一个检查所传递的字符串确实是URI的函数中更为安全,以避免意外地在计算机上启动随机进程。

public static bool IsValidUri(string uri)
{
    if (!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
        return false;
    Uri tmp;
    if (!Uri.TryCreate(uri, UriKind.Absolute, out tmp))
        return false;
    return tmp.Scheme == Uri.UriSchemeHttp || tmp.Scheme == Uri.UriSchemeHttps;
}

public static bool OpenUri(string uri) 
{
    if (!IsValidUri(uri))
        return false;
     System.Diagnostics.Process.Start(uri);
     return true;
}


6

您无法从提升权限的应用程序启动网页。这将引发0x800004005异常,这可能是因为explorer.exe和浏览器未在高架上运行。

要在非提升的Web浏览器中从提升的应用程序启动网页,请使用 Mike Feng编写的代码。我试图将URL传递给lpApplicationName,但这没有用。当我将CreateProcessWithTokenW与lpApplicationName =“ explorer.exe”(或iexplore.exe)和lpCommandLine = url一起使用时,也不会。

可以使用以下变通办法:创建一个具有一个任务的小型EXE项目:Process.Start(url),使用CreateProcessWithTokenW运行此.EXE。在我的Windows 8 RC上,它可以正常工作,并在Google Chrome中打开网页。


1
请参阅注释Explorer.exe不支持使用“放高”:“不幸的是,Windows Shell团队答复说,“ Explorer.exe AppName.exe”的当前行为是一个错误,在Windows的将来更新/版本中可能不起作用。不应该依赖它。”
卡尔·沃尔什

4

这是我完整的代码如何打开。

有2个选项:

  1. 使用默认浏览器打开(行为类似于在浏览器窗口中打开)

  2. 通过默认命令选项打开(行为就像您使用“ RUN.EXE”命令一样)

  3. 通过“资源管理器”打开(行为就像您在文件夹窗口URL中写了URL)

[可选建议] 4.使用iexplore进程位置打开所需的URL

码:

internal static bool TryOpenUrl(string p_url)
    {
        // try use default browser [registry: HKEY_CURRENT_USER\Software\Classes\http\shell\open\command]
        try
        {
            string keyValue = Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\Software\Classes\http\shell\open\command", "", null) as string;
            if (string.IsNullOrEmpty(keyValue) == false)
            {
                string browserPath = keyValue.Replace("%1", p_url);
                System.Diagnostics.Process.Start(browserPath);
                return true;
            }
        }
        catch { }

        // try open browser as default command
        try
        {
            System.Diagnostics.Process.Start(p_url); //browserPath, argUrl);
            return true;
        }
        catch { }

        // try open through 'explorer.exe'
        try
        {
            string browserPath = GetWindowsPath("explorer.exe");
            string argUrl = "\"" + p_url + "\"";

            System.Diagnostics.Process.Start(browserPath, argUrl);
            return true;
        }
        catch { }

        // return false, all failed
        return false;
    }

和助手功能:

internal static string GetWindowsPath(string p_fileName)
    {
        string path = null;
        string sysdir;

        for (int i = 0; i < 3; i++)
        {
            try
            {
                if (i == 0)
                {
                    path = Environment.GetEnvironmentVariable("SystemRoot");
                }
                else if (i == 1)
                {
                    path = Environment.GetEnvironmentVariable("windir");
                }
                else if (i == 2)
                {
                    sysdir = Environment.GetFolderPath(Environment.SpecialFolder.System);
                    path = System.IO.Directory.GetParent(sysdir).FullName;
                }

                if (path != null)
                {
                    path = System.IO.Path.Combine(path, p_fileName);
                    if (System.IO.File.Exists(path) == true)
                    {
                        return path;
                    }
                }
            }
            catch { }
        }

        // not found
        return null;
    }

希望我能帮上忙。


3
我想知道的是..当各种各样的人已经很难回答这个问题时,为什么使它变得如此复杂呢?
CularBytes 2014年

为什么不只使用SearchPath而不是您自己的GetWindowsPath
ub3rst4r 2014年

3
为什么要清空捕获块?吞下异常不是一个坏主意吗?
reggaeguitar 2015年

3

老派的方式;)

public static void openit(string x) {
   System.Diagnostics.Process.Start("cmd", "/C start" + " " + x); 
}

用: openit("www.google.com");


2

由于今天我遇到类似的问题,因此我有解决方案。

假设您想通过运行具有管理员权限的应用打开http://google.com

ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo); 

1
我应该为该解决方案使用哪些引用/命名空间?
SophisticatedUndoing 2015年

1
@SophisticatedUndoing我相信ProcessStartInfo和Process位于System.Diagnostics中
Francis Lord
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.