C# “Windows 10打开”;你';“我需要一个新的应用程序才能打开myapp”;在尝试启动流程时

C# “Windows 10打开”;你';“我需要一个新的应用程序才能打开myapp”;在尝试启动流程时,c#,C#,在早期版本的Windows中(8和10之前)。您可以简单地执行这段代码: class Program { static void Main(string[] args) { TryStart("myapp:", "https://www.google.com"); } private static void TryStart(String url, String raw = "") { try {

在早期版本的Windows中(8和10之前)。您可以简单地执行这段代码:

class Program
{
    static void Main(string[] args)
    {
        TryStart("myapp:", "https://www.google.com");
    }

    private static void TryStart(String url, String raw = "")
    {
        try
        {
            if (!String.IsNullOrEmpty(url))
            {
                Process.Start(url);
            }
        }
        catch
        {
            if (!String.IsNullOrEmpty(raw))
            {
                Process.Start(raw);
            }
        }
    }
}
它将完美地工作。如果该程序不存在,它将打开该网页。如果程序确实存在,它会打开它

但是,在Windows 8和10中,如果该程序不存在,您将收到以下消息:


而且这个网站永远不会被打开。有没有其他方法可以解决这个问题?

我们来看看这个过程是否存在,然后启动相应的程序,如下所示:

        private static void TryStart(String url, String raw = "")
        {
            var processes = Process.GetProcessesByName(url);
            if (processes!=null && processes.Any())
            {
                Process.Start(url);

                //Process.Start(processes.First().ProcessName); //This can be used as well to start.
            }
            else
            {
                Process.Start(raw);
            }

        }

好的,我试着自己运行下面的代码,它在Win 10 pro中工作。检查一下,看看这是否适合你

string url = "http://stackoverflow.com";

var processes = Process.GetProcessesByName(url);
if (processes != null && processes.Any())
{
  Process.Start(processes.First().ProcessName); //This can be used as well to start.
}
else
{
 Process.Start(url);
}

当我尝试运行一个注册的应用程序时,即使该应用程序没有运行,它也能工作。如果我使用url,它会打开默认浏览器

所需的结果是什么?打开特定浏览器或特定应用程序?或者只是url?因为你所描述的是Win 10中的默认结果,这很有意义。您正在尝试打开应用程序,而不是启动浏览器。您没有看到问题。“如果程序不存在,它将打开网页。如果程序存在,它将打开网页。”它在Windows 7上工作,因为当时没有内置应用商店。在Windows 7中,如果你试图打开一个不存在的进程/协议,你将抛出一个异常,因此上面的代码片段将打开网页。但是,Windows 8和10上从未引发异常,因为Microsoft通过重定向到应用商店弹出窗口来规避此问题。我将使用“如何检测浏览器协议处理程序”并在@Stavm正确处理它。这不是浏览器协议,而是进程协议。这不包括进程未启动时的情况。它只会打开网页。AFAIK进程在启动时可以查询。如果要查询已注册的服务,可以参考和。中提供了这些方面的详细解释