Comment ouvrir une page Web depuis mon application?

126

Je souhaite que mon application WPF ouvre le navigateur par défaut et accède à une certaine page Web. Comment je fais ça?

Alex Baranosky
la source

Réponses:

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

Une des nombreuses façons.

Inisheer
la source
3
J'ai aussi utilisé ceci, mais maintenant il s'avère que cela ne fonctionne pas avec UAC. Dans mon application, j'ai ceci dans le manifeste <requiredExecutionLevel level = "requireAdministrator" uiAccess = "false" /> Lorsque j'exécute l'application sous Windows 8 (où vous ne pouvez plus désactiver l'UAC), j'obtiens l'exception suivante lors de l'ouverture d'une page Web : Win32Exception (0x80004005): Classe non enregistrée à System.Diagnostics.Process.StartWithShellExecuteEx
lvmeijer
Cet effet ne se produira pas lorsque je change de requireAdministrator en asInvoker. Mais alors l'application n'est pas élevée :-(
lvmeijer
4
Cela pourrait ouvrir une assez grosse faille de sécurité dans votre application si vous deviez accidentellement obtenir l'URL à partir de l'entrée utilisateur et ne pas valider qu'il s'agit d'un URI. Ils peuvent ensuite lancer n'importe quelle application de leur choix sur votre système.
cdiggins
1
FYI: fonctionne sous Unity, Mono, sur Os X et Windows. Cela ne fonctionne pas sous iOS. Je n'ai pas testé les autres.
Grant M
2
Que diriez-vous d'ouvrir un fichier html local?
guogangj
34

J'utilise cette ligne pour lancer le navigateur par défaut:

System.Diagnostics.Process.Start("http://www.google.com"); 
ajma
la source
1
Cette réponse est un double.
MAXE
1
@MAXE Les deux réponses ont été créées dans la même minute.
4424dev
20

La réponse acceptée ne fonctionne plus sur .NET Core 3 . Pour le faire fonctionner, utilisez la méthode suivante:

var psi = new ProcessStartInfo
{
    FileName = url,
    UseShellExecute = true
};
Process.Start (psi);
Alexandre Smirnov
la source
19

Bien qu'une bonne réponse ait été donnée (en utilisant Process.Start), il est plus sûr de l'encapsuler dans une fonction qui vérifie que la chaîne passée est bien un URI, pour éviter de démarrer accidentellement des processus aléatoires sur la machine.

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;
}
cdiggins
la source
6

Vous ne pouvez pas lancer une page Web à partir d'une application élevée. Cela déclenchera une exception 0x800004005, probablement parce qu'explorer.exe et le navigateur s'exécutent sans élévation de privilèges.

Pour lancer une page Web à partir d'une application élevée dans un navigateur Web non élevé, utilisez le code créé par Mike Feng . J'ai essayé de transmettre l'URL à lpApplicationName mais cela n'a pas fonctionné. Pas non plus lorsque j'utilise CreateProcessWithTokenW avec lpApplicationName = "explorer.exe" (ou iexplore.exe) et lpCommandLine = url.

La solution de contournement suivante fonctionne: Créez un petit projet EXE qui a une tâche: Process.Start (url), utilisez CreateProcessWithTokenW pour exécuter ce .EXE. Sur mon Windows 8 RC, cela fonctionne bien et ouvre la page Web dans Google Chrome.

lvmeijer
la source
1
Voir le commentaire , l'utilisation de Explorer.exepour désélever n'est pas prise en charge: "Malheureusement, l'équipe Windows Shell a répondu que le comportement actuel de" Explorer.exe AppName.exe "était un bogue et pourrait ne pas fonctionner dans les futures mises à jour / versions de Windows. Applications ne devrait pas s’y fier. "
Carl Walsh
4

Voici mon code complet comment ouvrir.

il y a 2 options:

  1. ouvrir en utilisant le navigateur par défaut (le comportement est comme ouvert dans la fenêtre du navigateur)

  2. ouvrir via les options de commande par défaut (le comportement est comme vous utilisez la commande "RUN.EXE")

  3. ouvrir via 'explorer' (le comportement est comme vous avez écrit l'URL dans l'url de la fenêtre de votre dossier)

[suggestion facultative] 4. utilisez l'emplacement du processus iexplore pour ouvrir l'url requise

CODE:

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;
    }

et la fonction Helper:

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;
    }

J'espère que j'ai aidé.

mr.baby123
la source
3
Ce que je me demande, c'est ... pourquoi rendre les choses si compliquées alors que diverses personnes ont déjà simplifié la réponse à la question?
CularBytes
Pourquoi ne pas simplement utiliser SearchPath au lieu du vôtre GetWindowsPath?
ub3rst4r
3
Pourquoi des blocs de capture vides? N'est-ce pas une mauvaise idée de simplement avaler des exceptions?
reggaeguitar
3

La vieille école;)

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

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

Moh.Kirkuk
la source
2

J'ai la solution pour cela car j'ai un problème similaire aujourd'hui.

Supposons que vous souhaitiez ouvrir http://google.com à partir d'une application exécutée avec des privilèges d'administrateur:

ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo); 
vainqueur
la source
1
quelles références / espaces de noms dois-je utiliser pour cette solution?
Sophistiqué
1
@SophicatedUndoing Je crois que ProcessStartInfo et Process sont situés dans System.Diagnostics
Francis Lord