내 응용 프로그램에서 웹 페이지를 여는 방법은 무엇입니까?


126

내 WPF 응용 프로그램에서 기본 브라우저를 열고 특정 웹 페이지로 이동하고 싶습니다. 어떻게하나요?

답변:


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

여러 가지 방법 중 하나입니다.


3
이것도 사용했지만 이제 UAC에서 작동하지 않는 것으로 나타났습니다. 내 응용 프로그램에서 매니페스트 <requestedExecutionLevel level = "requireAdministrator"uiAccess = "false"/>에 있습니다. Windows 8에서 앱을 실행할 때 (UAC를 더 이상 비활성화 할 수없는 경우) 웹 페이지를 열 때 다음 예외가 발생합니다. : Win32Exception (0x80004005) : System.Diagnostics.Process.StartWithShellExecuteEx에 등록되지 않은 클래스
lvmeijer

이 효과는 requireAdministrator를 asInvoker로 변경하면 발생하지 않습니다. 그러나 응용 프로그램은 :-( 상승하지 않습니다
lvmeijer

4
실수로 사용자 입력에서 URL을 가져오고 URI인지 유효성을 검사하지 않으면 응용 프로그램에 매우 큰 보안 허점이 발생할 수 있습니다. 그런 다음 시스템에서 원하는 모든 응용 프로그램을 시작할 수 있습니다.
cdiggins

1
참고 : Unity, Mono, Os X 및 Windows에서 작동합니다. iOS에서는 작동하지 않습니다. 나는 다른 사람들을 테스트하지 않았습니다.
Grant M

2
로컬 HTML 파일을 여는 것은 어떻습니까?
guogangj

34

이 줄을 사용하여 기본 브라우저를 시작했습니다.

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

1
이 답변은 중복입니다.
MAXE

1
@MAXE 두 답변이 같은 분에 만들어졌습니다.
4424dev

20

수락 된 답변은 더 이상 .NET Core 3 에서 작동하지 않습니다 . 작동하려면 다음 방법을 사용하십시오.

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

19

좋은 대답이 주어졌지만 (사용 Process.Start), 전달 된 문자열이 실제로 URI인지 확인하는 함수로 캡슐화하여 실수로 컴퓨터에서 임의의 프로세스를 시작하지 않도록하는 것이 더 안전합니다.

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

상승 된 응용 프로그램에서 웹 페이지를 시작할 수 없습니다. 0x800004005 예외가 발생합니다. explorer.exe와 브라우저가 권한이없는 상태로 실행되기 때문일 수 있습니다.

상승되지 않은 웹 브라우저에서 상승 된 응용 프로그램에서 웹 페이지를 시작하려면 Mike Feng에서 만든 코드를 사용하십시오 . URL을 lpApplicationName에 전달하려고했지만 작동하지 않았습니다. lpApplicationName = "explorer.exe"(또는 iexplore.exe) 및 lpCommandLine = url과 함께 CreateProcessWithTokenW를 사용할 때도 마찬가지입니다.

다음 해결 방법이 작동합니다. 하나의 작업이있는 작은 EXE 프로젝트를 만듭니다. Process.Start (url), CreateProcessWithTokenW를 사용하여이 .EXE를 실행합니다. 내 Windows 8 RC에서는 제대로 작동하고 Google 크롬에서 웹 페이지를 엽니 다.


1
설명을 참조하십시오 .Explorer.exe 권한을 해제하는 데 사용 하는 것은 지원되지 않습니다. "안타깝게도 Windows Shell 팀은"Explorer.exe AppName.exe "의 현재 동작이 버그이며 향후 Windows 업데이트 / 버전에서 작동하지 않을 수 있다고 응답했습니다. 의존해서는 안됩니다. "
Carl Walsh

4

여는 방법은 다음과 같습니다.

두 가지 옵션이 있습니다.

  1. 기본 브라우저를 사용하여 열기 (동작은 브라우저 창에서 열리는 것과 같습니다)

  2. 기본 명령 옵션을 통해 열기 ( "RUN.EXE"명령을 사용하는 것과 같은 동작)

  3. '탐색기'를 통해 열기 (동작은 폴더 창 URL에 URL을 작성한 것과 같습니다)

[선택적 제안] 4. iexplore 프로세스 위치를 사용하여 필요한 URL을 엽니 다.

암호:

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

및 도우미 기능 :

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

내가 도왔기를 바랍니다.


3
내가 궁금한 것은 .. 여러 사람들이 이미 질문에 답하기를 간단하게 만들었을 때 왜 그렇게 복잡하게 만드나요?
CularBytes

자신의 것 대신 SearchPath 를 사용하지 않는 이유는 무엇 GetWindowsPath입니까?
ub3rst4r

3
왜 빈 캐치 블록입니까? 예외를 그냥 삼키는 것은 나쁜 생각이 아닙니까?
reggaeguitar 2015 년

3

오래된 학교 방식;)

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

사용하다: openit("www.google.com");


2

오늘 비슷한 문제가 있기 때문에 이에 대한 해결책이 있습니다.

관리자 권한으로 실행되는 앱에서 http://google.com 을 열고 싶다고 가정 해 보겠습니다 .

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

1
이 솔루션에 어떤 참조 / 네임 스페이스를 사용해야합니까?
SophisticatedUndoing

1
@SophisticatedUndoing 저는 ProcessStartInfo와 Process가 System.Diagnostics에 있다고 생각합니다
Francis Lord
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.