C #의 기본 브라우저에서 여는 방법


257

작은 C # 응용 프로그램을 디자인하고 있으며 웹 브라우저가 있습니다. 나는 현재 내 컴퓨터의 모든 기본값을 Google 크롬이 기본 브라우저라고 말하지만 응용 프로그램에서 링크를 클릭하여 새 창에서 열면 인터넷 탐색기가 열립니다. 대신 기본 브라우저에서 이러한 링크를 열 수있는 방법이 있습니까? 아니면 내 컴퓨터에 문제가 있습니까?

내 문제는 응용 프로그램에 웹 브라우저가 있으므로 Google로 이동하여 "스택 오버플로"를 입력하고 첫 번째 링크를 마우스 오른쪽 버튼으로 클릭하고 "새 창에서 열기"를 클릭하면 Chrome 대신 IE에서 열립니다. 이 코드가 잘못 코딩되었거나 컴퓨터에 설정이 올바르지 않은 것입니까

=== 편집 ===

이것은 정말로 성가신 일입니다. 브라우저가 IE임을 이미 알고 있지만 이전에는 제대로 작동했습니다. 링크를 클릭하면 크롬으로 열립니다. 나는 c #을 시작할 수 없기 때문에 응용 프로그램을 만들기 위해 날카로운 개발을 사용하고있었습니다. 나는 새로운 Windows 설치를했는데 응용 프로그램에서 너무 멀지 않아서 다시 시작하기로 결정했으며 이제는이 문제가 있습니다. 그것이 내 컴퓨터인지 아닌지 확실하지 않은 이유입니다. 기본 브라우저에서 단순히 새 링크를 열지 않고 링크를 클릭하면 IE가 전체 브라우저를 시작하는 이유는 무엇입니까?


Hehe, IE가 Chrome을 열도록 설득하는 것은 약간의 오르막 전투가 될 것입니다. 글쎄요. IE를 직접 실행하면 작동하지 않습니다. 또는 IE가 기본값이라면 그 문제에 대한 Chrome.
Hans Passant

@SLaks Mono? 무슨 소리 야?
Sean

1) getstartMenuDir Firefox 또는 Chrome StandartName 확인을 검색하십시오. 찾을 수 없다면. 2) 32 64 chrome ff 사용하는 표준 설치 위치 목록을 얻습니다. 그렇지 않다면 3) 최후의 수단으로 답을 사용하십시오.
bh_earth0

답변:


505

당신은 단지 쓸 수 있습니다

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

편집 : WebBrowser컨트롤은 IE의 포함 된 복사본입니다.
따라서 그 안의 모든 링크는 IE에서 열립니다.

이 동작을 변경하기 위해 Navigating이벤트를 처리 할 수 ​​있습니다 .


1
시도 해봐. Taskmgr.exe를 사용하면 두 개의 iexporer.exe 복사본이 실행되고 있습니다. 탐색은 프로세스 외부 프로세스에 대해 실행되지 않습니다.
한스 Passant

4
@Sean : 예. Process.Start(e.Url.ToString())
SLaks

2
브라우저 exe가 첫 번째 매개 변수로 지정되지 않으면 로컬 URL (file : ///)이 querystring과 함께 작동하지 않습니다.
HerrimanCoder

2
"url"이 응용 프로그램의 실제 경로로 바뀌면이 또한 실행될 수 있기 때문에이 방법으로도 보안 문제가 발생할 수 있습니다.
Gerrie Pretorius

1
@Spencer : URL을 신뢰할 수 있는지 확인하십시오.
SLaks

45

dotnet core 에서이 질문을 찾는 사람들을 위해. 여기서 해결책을 찾았습니다 .

암호:

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

감사! 나를 위해 작동하지만 ... open대신에 명령을 가진 macos 에서xdg-open
equiman

@Equiman 그렇게하지 않습니까? RuntimeInformation.IsOSPlatform(OSPlatform.OSX)아니면 리눅스에서 이미 사실입니까?
Joel Harkes

내가 해냈어 그러나 xdg-command"xdg-open : command not found"를 반환합니다. 그런 다음 open명령으로 테스트 하고 작동합니다.
equiman

@Equiman 그래서 리눅스와 OSX를 다른 것으로 전환해야 작동하는지 또는 macOS가 OSX에 떨어지지 않습니까?
Joel Harkes

1
내 생각 엔 그렇지 않다. 내 솔루션은 대체 대안이다.
equiman

38
public static void GoToSite(string url)
{
     System.Diagnostics.Process.Start(url);
}

문제를 해결해야합니다


7
'정적 무효 GotoSite'해야
베 루즈

15

http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx에서Process 언급 했습니까 ?

당신은 사용할 수 있습니다

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

1
UseShellExecute기본값은 true입니다.
SLaks

4
@ SLaks, 감사합니다. 반면에 반드시 있어야한다는 것을 언급하는 것이 중요합니다 true.
Andreas

1
확인 너무 게으른 사람들을 위해 ... 프로세스 "System.Diagnostics 네임을 사용하여"필요
닉 로버츠

이것은 WPF에 필요한 경로 인 것 같습니다. 방금 수행 Process.Start(url)하면 새 브라우저 창이 열리지 않습니다.
RubyHaus

5

상기 살펴보세요 GeckoFX 제어 .

GeckoFX는 오픈 소스 구성 요소로 Mozilla Gecko (Firefox)를 모든 .NET Windows Forms 응용 프로그램에 쉽게 포함시킬 수 있습니다. 완전히 주석 처리 된 C #으로 작성된 GeckoFX는 기본 Internet Explorer 기반 WebBrowser 컨트롤을 완벽하게 대체합니다.


내 문제는 응용 프로그램에 웹 브라우저가 있으므로 Google로 이동하여 "스택 오버플로"를 입력하고 첫 번째 링크를 마우스 오른쪽 버튼으로 클릭하고 "새 창에서 열기"를 클릭하면 Chrome 대신 IE에서 열립니다. 내가 잘못 코딩 한 것입니까, 아니면 컴퓨터에 잘못된 설정이 있습니까
Sean

@ SLaks : 왜 그렇게 말합니까? 문자열을 작성하고 GetDefaultBrowserPath ()와 동일하게 설정하는 것이 전혀 어렵다고 생각하지 않습니다.
의사

@Sean : 응용 프로그램 내에 웹 브라우저가 있으면 기본적으로 IE를 사용합니다. 탐색 이벤트를 통해 문제를 해결할 수 있습니다.
의사

OP가 별도의 프로세스로 시작한 기본 브라우저를 변경하지 않으려는 것을 깨닫고 내 대답을 수정했습니다.
의사

5

구식 방법으로 시도해보십시오.)

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

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


2
"Shellsock"을 악용 할 수 없습니까?
Joseph Lennox

@JosephLennox 그것은 훌륭한 포인트입니다! URL의 System.Diagnostics.Process.Start가 직접적으로 안전하지 않다는 것을 언급 할 가치가 있습니다. 반면에, 사용자가 THEIR 컴퓨터에서 응용 프로그램을 실행하는 경우 (아마도있을 수 있음) 최악의 경우 자체 시스템을 중단하는 것입니다. : P
Ben

4
@Ben 입력이 나오는 위치에 따라 다릅니다. 공유 데이터 소스 인 경우 일단 사용자가 악의적 인 명령을 입력 할 수 있고 "이동"을 클릭하는 다른 모든 사용자는 해당 사용자의 자비에 따릅니다.
Dan Bechard

4

많은 연구를 한 후에 나는 주어진 대답의 대부분이 닷넷 코어에서 작동하지 않는다고 생각합니다. 1 System.Diagnostics.Process.Start("http://google.com").; -닷넷 코어와 작동하지 않습니다

2. 작동하지만 기본 브라우저가 크롬 인 경우 새 창 열기를 차단합니다

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

아래는 가장 간단하며 모든 시나리오에서 작동합니다.

Process.Start("explorer", url);

이것은 나를 위해 해결했습니다.
Rufw91

3

이것은 나를 위해 기본값을 열었습니다.

System.Diagnostics.Process.Start(e.LinkText.ToString());

EventArgs에 LinkText의 속성을 제공하는 패키지가 있습니까?
Nick Roberts

3

dotnet core를 사용하면 오류가 발생합니다 Process.Start(URL). 다음 코드는에서 작동 dotnet core합니다. 대신 브라우저를 추가 할 수 있습니다 Chrome.

var processes = Process.GetProcessesByName("Chrome");
var path  = processes.FirstOrDefault()?.MainModule?.FileName;
Process.Start(path,  url);

3
Q에 대한 대답이 아니라, 기본 브라우저가 무엇인지 코드에 알려져 있지 않습니다
Arjan

0

UWP에서 :

await Launcher.LaunchUriAsync(new Uri("http://google.com"));

이다 Launcher.LaunchUriAsync . 완전한 예를 보려면 링크를 따르십시오. 흥미롭게도 반환 값을 사용하면 호출자가 URL을 열 었는지 여부를 알 수 있습니다. 이것은 Windows 8 / Server2012 / Phone8 이상용입니다. 소프트웨어가 이전 버전과 호환되어야하는 경우에는 사용할 수 없습니다.
Stéphane Gourichon


0

현재 버전의 탐색기로 레지스트리를 업데이트하십시오.
@ "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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.