Как открыть веб-браузер из .NET-программы? Process.Start() не работает?

У меня есть URL-адрес, и я хочу запустить его в браузере по умолчанию. Я пробовал два метода:

Process.Start("http://qaru.site/");

... и тот, который подробно описан в этом другом вопросе, используя ShellExecute.

В обоих случаях я получаю сообщение об ошибке: Windows не может найти '/qaru.site/...'. Убедитесь, что вы набрали имя правильно, а затем повторите попытку.

Не следует пытаться открыть его как файл, хотя... из того, что я понимаю, он должен распознать его как URL-адрес и открыть его в браузере по умолчанию. Что мне не хватает?

Кстати: OS = Vista и .NET = 3.5

ИЗМЕНИТЬ

В соответствии с эта статья MS KB, поскольку Process.Start по умолчанию устанавливает UseShellExecute, он должен запустить браузер по умолчанию.

ИЗМЕНИТЬ

Вот что работает:

System.Diagnostics.Process.Start(@"C:\Program Files\Internet Explorer\IExplore.exe", "http://qaru.site/");

К сожалению, это действительно не запускает браузер по умолчанию, и он также не работает, если IE не установлен в "обычном" месте. Я не уверен, что делать здесь.

Дополнительная информация:

ОК, поэтому ошибка, которую я получаю, это номер ошибки -2147467259. Глядя на Google для этого, похоже, что он не очень описательный. Это может быть ошибка ассоциации файлов или что-то в этом роде.

Сюжет сгущается:

Итак, я проверил раздел реестра, который должен иметь мою ассоциацию файлов для http:

KEY_CLASSES_ROOT\http\shell\open\command\default

Здесь значение:

"C:\Program Files\Mozilla Firefox\firefox.exe" -requestPending -osint -url "%1"

Это имеет смысл. Я фактически скопировал эту строку в командную строку и заменил% 1 на /qaru.site/..., и она сработала и открыла firefox. Я просто не понимаю, почему Process.Start не связывает URL с этой командой...

Ответ 1

Хорошо, поэтому он загадочно начал нормально работать, ничего не меняя. Я не могу это объяснить. Однако, в то же время, я написал еще один метод поиска и выполнения браузера по умолчанию. Это немного взломанно, но намного лучше, чем просто загружать 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();
}

Ответ 2

Это работает для меня:

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

Не забывайте UseShellExecute, если вы хотите использовать автоматическое распознавание типа команды (в данном случае, http/browser).

Изменить: работает ли это, если вы Win+R URL?

Ответ 3

Попробуйте

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

Это запустит Internet Explorer и URL. Process.Start не обнаруживает приложения/браузеры automaticall.y

Ответ 4

Это серьезная проблема, которую я видел, когда Firefox является веб-браузером по умолчанию.

Если мы используем System.Windows.Forms.Help.ShowHelp(null, " http://microsoft.com" ), такое сообщение об ошибке может быть работал в Windows. Однако Help.ShowHelp работает не так, как ожидалось, на Mono/openSUSE.