Как открыть веб-браузер из .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.