2013-08-03 2 views
16

내 Windows Forms 응용 프로그램에 textBox 및 webBrowser 컨트롤이 있습니다. 사용자가 textBox에 HTML 코드를 입력 할 때마다 WebBrowser 컨트롤은 컴파일 된 양식을 표시합니다. 이에 대한 코드 :외부 브라우저에서 webBrowser 컨트롤의 링크를 여는 방법은 무엇입니까?

private void textBox2_TextChanged(object sender, EventArgs e) 
{ 
    webBrowser1.DocumentText = textBox2.Text; 
} 

하지만 WebBrowser 컨트롤에서 링크를 클릭 할 때마다,이 같은 웹 브라우저 컨트롤에서 엽니 다. 내가 원하는 것은 시스템의 기본 웹 브라우저에서 열어야한다는 것입니다. 그래서 링크 클릭을 처리하는이 webBrowser 컨트롤에 대한 이벤트가 있습니까?

+0

웹 브라우저의 모든 링크를'target = "_ blank"'로 설정하면 어떻게 될지 궁금합니다. – Tombatron

+0

@Tombatron 방금이 질문에 대한 새로운 대답을 게시했습니다. 참조하십시오. – Gaugeforever

답변

21

가장 쉬운 방법은 Navigating 이벤트를 차단하는 것입니다.

public void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    //cancel the current event 
    e.Cancel = true; 

    //this opens the URL in the user's default browser 
    Process.Start(e.Url.ToString()); 
} 
+0

고마워,이 작품 :) –

+0

나는 똑같은 문제가있어서 위의 해결책을 시도했다. 크롬이 기본 브라우저 인 경우 작동합니다. 그러나 IE 10이 기본 브라우저 인 경우에도 여전히 웹 브라우저 컨트롤에서 열립니다. 어떤 아이디어? – Feroz

+0

그러나이 방법을 시도해도 링크에 _blank 대상이 있으면 탐색 이벤트가 실행되지 않습니다! 이 문제를 해결할 수 없습니다. –

3

아마도 네비게이션 이벤트에서 을 사용해 볼 수 있습니까?

4

Process.Start 기본 브라우저에서 URL을 열 것입니다, 다음은 탐색을 취소 할 수 WebBrowser 제어를 말한다.

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    Process.Start(e.Url.ToString()); 

    e.Cancel = true; 
} 

방금 ​​테스트 할 샘플 앱을 만들었습니다.

4

여기에이 코드는 작동합니다 :

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    System.Diagnostics.Process.Start(e.Url.ToString()); 

    e.Cancel = true; 
} 

내가이 일을하고 수행해야 할이 시도!

희망이 도움이됩니다! 나는이 대답에 더 많은 무언가를 추가 할

5

,

사촌하는 WebBrowser의 내용이 변경 될 때 방법은 매번 실행 webBrowser1_Navigating. 당신이 에에 DocumentText을 값을 설정할 때마다 경우

이 메서드가 호출되고이 더 URL없고 기본값이 에 대한 경우 : 빈. 우리는 또한 이것을 검사해야합니다. 그렇지 않으면 내용을로드하지 않습니다.

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
    { 
     if (!(e.Url.ToString().Equals("about:blank", StringComparison.InvariantCultureIgnoreCase))) 
     { 
      System.Diagnostics.Process.Start(e.Url.ToString()); 
      e.Cancel = true; 
     } 
    } 
0

누구도 target="_blank" 인 링크에 대해 괜찮은 답변을 했으므로. 나는 그렇게하려고 시도 할 것이다.

먼저이 기능이 작동하지 않는 이유는 무엇입니까? 사용자가 웹 브라우저 컨트롤에서 링크를 클릭하면 탐색 이벤트가 발생하지 않으므로 새 창 이벤트가 실행됩니다. 새 창 이벤트에서는 새 창을 인터럽트하고 기본 창을 열 때 클릭 한 요소 나 URL에 액세스 할 수 없습니다. 여기 당신이하는 방법입니다.

먼저 문서 완료 이벤트에 다음 코드를 추가하십시오.

private void webBrowserControl_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     string tagUpper = ""; 

     foreach (HtmlElement tag in (sender as WebBrowser).Document.All) 
     { 
      tagUpper = tag.TagName.ToUpper(); 

      if((tagUpper == "AREA") || (tagUpper == "A")) 
      { 
       tag.MouseUp += new HtmlElementEventHandler(this.link_MouseUp); 
      } 
     } 
    } 

이 작업은 모든 html 요소 태그를 살펴보고 if 문에 정의한 모든 태그를 찾습니다. 제 경우에는 AREA 태그도 필요했습니다. 원하는 태그를 붙잡을 수 있습니다. 그런 다음 해당 요소에 클릭 이벤트를 첨부합니다.

다음으로이 코드를 사용하여 이벤트 자체를 만듭니다.

void link_MouseUp(object sender, HtmlElementEventArgs e) 
    { 
     Regex pattern = new Regex("href=\\\"(.+?)\\\""); 
     Match match = pattern.Match((sender as HtmlElement).OuterHtml); 
     string link = match.Groups[1].Value; 

     Process.Start(link); 
    } 

이 코드는 정규식 패턴, 당신은 매우 가능성이 자신의 필요이 패턴을 변경해야합니다 을 설정합니다. 여기에 중단 점을 추가하고 정규식이 어떻게 보이는지 확인하는 것이 좋습니다. 정규식은 regex link에서 테스트 할 수 있습니다. 그룹화 할 때 괄호를 사용해야합니다. 탐욕스럽지 않게 물음표를 사용하는 것도 좋습니다. 그런 다음 해당 패턴을 검색하고 일치 그룹의 URL을 가져옵니다. 그 후, 그 URL로 프로세스를 시작하는 것입니다. 이렇게하면 기본 브라우저가 열리거나 기본 브라우저가 이미 열려있는 경우 새 탭을 추가합니다.

마지막으로해야 할 일은 링크의 기본 로직을 취소하는 것입니다. 다음 코드를 사용하여 NewWindow 이벤트에서이 작업을 수행합니다.

private void webBrowserControl_NewWindow(object sender, CancelEventArgs e) 
    { 
     e.Cancel = true; 
    } 
관련 문제