Comment ouvrir dans le navigateur par défaut en C #

258

Je conçois une petite application C # et il y a un navigateur Web dedans. J'ai actuellement tous mes paramètres par défaut sur mon ordinateur, disons que Google Chrome est mon navigateur par défaut, mais quand je clique sur un lien dans mon application pour l'ouvrir dans une nouvelle fenêtre, il ouvre Internet Explorer. Existe-t-il un moyen d'ouvrir ces liens dans le navigateur par défaut? Ou y a-t-il un problème sur mon ordinateur?

Mon problème est que j'ai un navigateur Web dans l'application, alors dites que vous allez sur Google et tapez "débordement de pile" et faites un clic droit sur le premier lien et cliquez sur "Ouvrir dans une nouvelle fenêtre", il s'ouvre dans IE au lieu de Chrome. Est-ce quelque chose que j'ai mal codé ou y a-t-il un paramètre incorrect sur mon ordinateur

=== EDIT ===

C'est vraiment ennuyeux. Je sais déjà que le navigateur est IE, mais je le faisais bien avant. Lorsque j'ai cliqué sur un lien, il s'est ouvert en chrome. J'utilisais Sharp Develop pour faire l'application à ce moment-là car je ne pouvais pas faire démarrer c # express. J'ai fait une nouvelle installation de Windows et comme je n'étais pas trop loin dans mon application, j'ai décidé de recommencer, et maintenant j'ai ce problème. C'est pourquoi je ne sais pas si c'est mon ordinateur ou non. Pourquoi IE démarrerait-il tout le navigateur lorsqu'un lien est cliqué plutôt que d'ouvrir simplement le nouveau lien dans le navigateur par défaut?

Sean
la source
Hehe, convaincre IE d'ouvrir Chrome pour vous va être un peu difficile. Eh bien, pas du tout. Cela ne fonctionne pas non plus si vous exécutez directement IE. Ou Chrome d'ailleurs si IE est la valeur par défaut.
Hans Passant
@SLaks Mono? Qu'est-ce que tu racontes?
Sean
1) getstartMenuDir Recherchez Firefox ou Chrome StandartName. s'il n'est pas trouvé. 2) obtenir la liste des emplacements d'installation standard qui existent jamais 32 64 chrome ff utiliser cela. sinon 3) en dernier recours, utilisez les réponses.
bh_earth0

Réponses:

506

Vous pouvez simplement écrire

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

EDIT : Le WebBrowsercontrôle est une copie intégrée d'IE.
Par conséquent, tous les liens à l'intérieur de celui-ci s'ouvriront dans IE.

Pour modifier ce comportement, vous pouvez gérer l' Navigatingévénement.

SLaks
la source
1
Essayez-le. Utilisez Taskmgr.exe, vous verrez deux copies de iexporer.exe en cours d'exécution. La navigation ne se déclenche pas pour celle hors processus.
Hans Passant
4
@Sean: Oui. Process.Start(e.Url.ToString())
SLaks le
2
L'URL locale (fichier: ///) ne fonctionne pas avec une chaîne de requête à moins que l'exe du navigateur soit spécifié comme premier paramètre.
HerrimanCoder
2
Sachez que cette méthode can peut également introduire un problème de sécurité, car si "l'url" est remplacée par un chemin physique vers une application, elle s'exécutera également
Gerrie Pretorius
1
@Spencer: assurez-vous que l'URL est fiable.
SLaks le
45

Pour ceux qui trouvent cette question dans le noyau dotnet. J'ai trouvé une solution ici

Code:

private void OpenUrl(string url)
{
    try
    {
        Process.Start(url);
    }
    catch
    {
        // hack because of this: https://github.com/dotnet/corefx/issues/10361
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            url = url.Replace("&", "^&");
            Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true });
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            Process.Start("xdg-open", url);
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
        {
            Process.Start("open", url);
        }
        else
        {
            throw;
        }
    }
}
Joel Harkes
la source
Merci! fonctionne pour moi ... mais dans macos avec opencommande au lieu dexdg-open
equiman
@Equiman ne fait pas ça? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)ou sera-ce déjà vrai sous Linux?
Joel Harkes du
Je l'ai fait. Mais xdg-commandrenvoie "xdg-open: commande introuvable". Ensuite, j'ai testé avec opencommande et fonctionne.
equiman
@Equiman donc vous dites que je devrais changer elseif linux et OSX pour le faire fonctionner ou les macos ne tombent-elles pas udner OSX?
Joel Harkes du
1
Je pense que non ... ma solution est en quelque sorte une alternative.
equiman
38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

Cela devrait résoudre votre problème

user2193090
la source
7
devrait être «statique vide GotoSite»
Behrooz
15

Avez-vous essayé Processcomme mentionné ici: http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx ?

Vous pourriez utiliser

Process myProcess = new Process();

try
{
    // true is the default, but it is important not to set it to false
    myProcess.StartInfo.UseShellExecute = true; 
    myProcess.StartInfo.FileName = "http://some.domain.tld/bla";
    myProcess.Start();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}
Andreas
la source
1
UseShellExecutepar défaut à true.
SLaks le
4
@SLaks, merci. D'un autre côté, il est important de mentionner que cela doit l'être true.
Andreas
1
Pour ceux qui sont trop paresseux pour vérifier ... Le processus nécessite "l'utilisation de System.Diagnostics"
Nick Roberts
Cela semble être l'itinéraire requis par WPF. Si vous le faites Process.Start(url), cela n'ouvrira pas une nouvelle fenêtre de navigateur.
RubyHaus
5

Jetez un œil au contrôle GeckoFX .

GeckoFX est un composant open source qui facilite l'intégration de Mozilla Gecko (Firefox) dans n'importe quelle application Windows Forms .NET. Écrit en C # clair et entièrement commenté, GeckoFX est le remplacement parfait du contrôle WebBrowser par défaut basé sur Internet Explorer.

LE DOCTEUR
la source
Mon problème est que j'ai un navigateur Web dans l'application, alors dites que vous allez sur Google et tapez "débordement de pile" et faites un clic droit sur le premier lien et cliquez sur "Ouvrir dans une nouvelle fenêtre", il s'ouvre dans IE au lieu de Chrome. Est-ce quelque chose que j'ai codé de manière incorrecte ou y a-t-il un paramètre incorrect sur mon ordinateur?
Sean
@SLaks: Pourquoi dites-vous cela? Je ne pense pas qu'il soit difficile d'écrire pour créer une chaîne et la définir égale à GetDefaultBrowserPath ().
LE DOCTEUR
@Sean: Si vous avez un navigateur Web dans votre application, il va utiliser IE par défaut. L'événement Navigation peut vous aider à contourner ce problème.
LE DOCTEUR
J'ai modifié ma réponse après avoir réalisé qu'OP ne souhaite pas changer le navigateur par défaut lancé par un processus distinct.
LE DOCTEUR
5

Essayez ceci, façon old school;)

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

en utilisant: openit ("www.google.com");

Moh.Kirkuk
la source
2
Cela ne peut-il pas être exploité, ala, "Shellsock"?
Joseph Lennox
@JosephLennox c'est un excellent point! il vaut probablement la peine de mentionner que System.Diagnostics.Process.Start directement sur l'URL n'est pas beaucoup (tout?) plus sûr! d'autre part, si l'utilisateur exécute votre application sur LEUR ordinateur (ils le sont probablement), le pire qu'il puisse faire est de casser son propre système: P
Ben
4
@Ben Dépend d'où vient l'entrée. S'il s'agit d'une source de données partagée, une fois que l'utilisateur a pu entrer une commande malveillante et que tous les autres utilisateurs qui cliquent sur «Aller» seraient à la merci de cet utilisateur.
Dan Bechard
4

Après de nombreuses recherches, je pense que la plupart des réponses données ne fonctionneront pas avec le noyau dotnet. 1 System.Diagnostics.Process.Start("http://google.com").; - Ne fonctionnera pas avec le noyau dotnet

2. Cela fonctionnera mais il bloquera l'ouverture de la nouvelle fenêtre au cas où le navigateur par défaut est chrome

 myProcess.StartInfo.UseShellExecute = true; 
    myProcess.StartInfo.FileName = "http://some.domain.tld/bla";
    myProcess.Start();

Ci-dessous est le plus simple et fonctionnera dans tous les scénarios.

Process.Start("explorer", url);
Mayank Tripathi
la source
Cela l'a résolu pour moi.
Rufw91
3

Cela a ouvert la valeur par défaut pour moi:

System.Diagnostics.Process.Start(e.LinkText.ToString());
Xero Phane
la source
Y a-t-il un package que vous utilisez qui donne à EventArgs la propriété de LinkText?
Nick Roberts
3

dotnet corejette une erreur si nous utilisons Process.Start(URL). Le code suivant fonctionnera dans dotnet core. Vous pouvez ajouter n'importe quel navigateur au lieu de Chrome.

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);
Natarajan Ganapathi
la source
3
Pas une réponse au Q, le code n'est pas connu du navigateur par défaut
Arjan
0

Dans UWP:

await Launcher.LaunchUriAsync(new Uri("http://google.com"));
Kibernetik
la source
Il s'agit de Launcher.LaunchUriAsync . Suivez le lien pour un exemple complet. Fait intéressant, la valeur de retour permet à l'appelant de savoir si l'URL a été ouverte ou non. Attention, c'est pour Windows 8 / Server2012 / Phone8 et supérieur. Si le logiciel doit être compatible avec les anciennes versions, il ne peut pas l'utiliser.
Stéphane Gourichon
0

Ouvrir dynamiquement

string addres= "Print/" + Id + ".htm";
           System.Diagnostics.Process.Start(Path.Combine(Environment.CurrentDirectory, addres));
سیدرسول میرعظیمی
la source
0

mettre à jour le registre avec la version actuelle de l'explorateur
@ "Software \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_BROWSER_EMULATION"

public enum BrowserEmulationVersion
{
    Default = 0,
    Version7 = 7000,
    Version8 = 8000,
    Version8Standards = 8888,
    Version9 = 9000,
    Version9Standards = 9999,
    Version10 = 10000,
    Version10Standards = 10001,
    Version11 = 11000,
    Version11Edge = 11001
}

key.SetValue(programName, (int)browserEmulationVersion, RegistryValueKind.DWord);
dfgv
la source