Uygulamamdan web sayfası nasıl açılır?


127

WPF uygulamamın varsayılan tarayıcıyı açmasını ve belirli bir web sayfasına gitmesini istiyorum. Bunu nasıl yaparım?

Yanıtlar:


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

Birçok yoldan biri.


3
Bunu da kullandım, ancak şimdi bunun UAC ile çalışmadığı ortaya çıktı. Uygulamamda bunu manifest dosyasında buluyorum <requestExecutionLevel level = "requireAdministrator" uiAccess = "false" /> Uygulamayı Windows 8 altında çalıştırdığımda (artık UAC'yi devre dışı bırakamazsınız), bir web sayfası açarken aşağıdaki istisnayı alıyorum : Win32Exception (0x80004005): Sınıf System.Diagnostics.Process.StartWithShellExecuteEx'de kayıtlı değil
lvmeijer

RequiredAdministrator'ı Invoker olarak değiştirdiğimde bu etki gerçekleşmeyecek. Ancak uygulama yükseltilmez :-(
lvmeijer

4
URL'yi yanlışlıkla kullanıcı girişinden alırsanız ve bunun bir URI olduğunu doğrulamazsanız, bu uygulamanızda oldukça büyük bir güvenlik açığı açabilir. Daha sonra sisteminizde istedikleri herhangi bir uygulamayı başlatabilirler.
cdiggins

1
Bilginize: Unity, Mono, Os X ve Windows'ta çalışır. İOS'ta çalışmaz. Diğerlerini test etmedim.
Grant M

2
Yerel bir html dosyasını açmaya ne dersiniz?
guogangj

35

Varsayılan tarayıcıyı başlatmak için bu satırı kullanıyorum:

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

1
Bu cevap bir kopya.
MAXE

1
@MAXE İki cevap aynı dakika içinde oluşturuldu.
4424dev

20

Kabul edilen yanıt artık .NET Core 3 üzerinde çalışmıyor . Çalışmasını sağlamak için aşağıdaki yöntemi kullanın:

var psi = new ProcessStartInfo
{
    FileName = url,
    UseShellExecute = true
};
Process.Start (psi);

19

İyi bir cevap verilmiş olsa da (kullanılarak Process.Start), makinede kazara rastgele işlemlerin başlamasını önlemek için, aktarılan dizenin gerçekten bir URI olduğunu kontrol eden bir işlevde kapsüllemek daha güvenlidir.

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


6

Yükseltilmiş bir uygulamadan bir web sayfası başlatamazsınız. Muhtemelen explorer.exe ve tarayıcı yükseltilmemiş olarak çalıştığından, bu bir 0x800004005 istisnası ortaya çıkaracaktır.

Yükseltilmemiş bir web tarayıcısında yükseltilmiş bir uygulamadan bir web sayfası başlatmak için Mike Feng tarafından yapılan kodu kullanın . URL'yi lpApplicationName'e iletmeye çalıştım ama bu işe yaramadı. Ayrıca CreateProcessWithTokenW'yi lpApplicationName = "explorer.exe" (veya iexplore.exe) ve lpCommandLine = url ile kullandığımda da değil.

Aşağıdaki geçici çözüm işe yarıyor: Bir görevi olan küçük bir EXE projesi oluşturun: Process.Start (url), bu .exe dosyasını çalıştırmak için CreateProcessWithTokenW kullanın. Windows 8 RC'imde bu iyi çalışıyor ve web sayfasını Google Chrome'da açar.


1
Bkz yorumunu kullanırken, Explorer.exede-yüceltiliyorlar için desteklenmez: Explorer.exe AppName.exe 'bir hata olduğunu "Maalesef, Windows Shell ekibi mevcut davranış olduğunu yanıtını verdi' ve olmayabilir gelecekteki güncellemeler / Windows sürümlerinde çalışması Uygulamaları. ona güvenmemeli. "
Carl Walsh

5

İşte tam kodum nasıl açılacağı.

2 seçenek vardır:

  1. varsayılan tarayıcı kullanarak açın (davranış, tarayıcı penceresinin içinde açıldığı gibidir)

  2. varsayılan komut seçenekleri aracılığıyla açın (davranış, "RUN.EXE" komutunu kullandığınız gibidir)

  3. 'gezgin' aracılığıyla aç (davranış, klasör pencerenizin url'sine url yazdığınız gibidir)

[isteğe bağlı öneri] 4. gerekli url'yi açmak için iexplore işlem konumunu kullanın

KODU:

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

ve Yardımcı işlevi:

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

Umarım yardım etmişimdir.


3
Merak ettiğim şey ... çeşitli insanlar soruyu şimdiden cevaplamayı çok basit hale getirirken neden bu kadar karmaşık hale getirildi?
CularBytes

Neden kendiniz yerine SearchPath'i kullanmıyorsunuz GetWindowsPath?
ub3rst4r

3
Yakalama blokları neden boş? İstisnaları yutmak kötü bir fikir değil mi?
reggaeguitar

3

Eski okul yolu;)

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

kullanın: openit("www.google.com");


2

Bugün benzer bir problemim olduğu için bunun için bir çözümüm var.

Yönetici ayrıcalıklarıyla çalışan bir uygulamadan http ://google.com'u açmak istediğinizi varsayalım:

ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe", "http://www.google.com/");
Process.Start(startInfo); 

1
Bu çözüm için hangi referansları / ad alanlarını kullanmalıyım?
SophisticatedUndoing

1
@SophisticatedUndoing Ben ProcessStartInfo ve Süreç System.Diagnostics bulunur inanıyoruz
Francis Rab
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.