2010-01-14 5 views
0

WebBrowser 컨트롤을 사용하는 WPF 응용 프로그램을 만들고 있습니다.
나는 점 몇 사투를 벌인거야 :WPF WebBrowser : 진행률 및 새 창 이벤트에 액세스하는 방법

  1. 제어에서 다운로드의 현재 진행 상황을 얻는 방법. WinForms WebBrowser 컨트롤은 ProgressChange 이벤트를 발생시킵니다.이 기능을 WPF 변형으로 어떻게 복제 할 수 있습니까?

  2. 새 창에서 열려고하는 링크를 캡처하는 방법. 다시 Winforms WebBrowser에는 NewWindow 이벤트가있었습니다. IE를 시작하고 같은 창에서 링크를 여는 것을 막기 위해이 방법을 사용할 수 있습니다. WPF 변형으로이 작업을 수행 할 수 있습니까?

답변

3

내가 원하는 정보를 찾았 으면 나는이 질문을 내가 관심있는 누구 에게라도 업데이트 할 것이라고 생각했습니다.

http://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser(v=VS.90).aspx의 맨 아래에는 "Getting to the native IWebBrowser2"라는 주석이 있습니다.

이것은 필요한 인터페이스를 얻는 방법을 보여주고 잘 작동하는 것 같습니다.

편집 : 우리의 관리되는 래퍼 아직 노출되지 않는 기본 웹 브라우저 컨트롤의 많은 기능이 있습니다

.. MSDN의 의견이 나에 사라지고 계속 여기에 링크의 내용 추가. 다음 코드 조각은 IWebBrowser2 인터페이스를 WPF WebBrowser 컨트롤에서 가져 오는 방법을 보여줍니다. 이렇게하면 다른 방법으로 공개적으로 노출되지 않은 개체의 메서드에 액세스 할 수 있습니다. 그러나이 코드 샘플은 완전히 신뢰할 수있는 코드에서만 작동한다는 점에 유의하십시오. (IE의 버전에 따라, 당신은 둘 중) System32\shdocvw.dll 또는 ieframe.dll에 COM 참조를 추가

이 코드를 컴파일하려면 ... http://msdn.microsoft.com/en-us/library/aa752127.aspx :

먼저

, 여기 IWebBrowser2 설명서를 참조하십시오.

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
[Guid("6d5140c1-7436-11ce-8034-00aa006009fa")] 
internal interface IServiceProvider 
{ 
    [return: MarshalAs(UnmanagedType.IUnknown)] 
    object QueryService(ref Guid guidService, ref Guid riid); 
} 

static readonly Guid SID_SWebBrowserApp = 
     new Guid("0002DF05-0000-0000-C000-000000000046"); 

// ... 

IServiceProvider serviceProvider = (IServiceProvider)myWebBrowser.Document; 
Guid serviceGuid = SID_SWebBrowserApp; 

Guid iid = typeof(SHDocVw.IWebBrowser2).GUID; 

SHDocVw.IWebBrowser2 myWebBrowser2 = 
    (SHDocVw.IWebBrowser2) serviceProvider.QueryService(ref serviceGuid, ref iid); 

그리고 나서 myWebBrowser2는 상호 작용할 준비가되었습니다.

는 또한 다음과 같이 생성 된 관리되는 래퍼를 통해 기본 웹 브라우저의 이벤트 ( http://msdn.microsoft.com/en-us/library/aa768309(VS.85).aspx)를 처리 할 수 ​​

:

//The "browser" is a object of WebBrowser class. 
SHDocVw.IWebBrowser2 axBrowser = typeof(WebBrowser).GetProperty("AxIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(browser, null) as SHDocVw.IWebBrowser2; 

((SHDocVw.DWebBrowserEvents_Event)axBrowser).NewWindow += OnWebBrowserNewWindow; 

private void OnWebBrowserNewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed) 
     { 
      Processed = true; 
      browser.Navigate(URL); 
     } 

:

SHDocVw.DWebBrowserEvents_Event wbEvents = (SHDocVw.DWebBrowserEvents_Event)myWebBrowser2; 
wbEvents.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(OnWebBrowserNewWindow); 

void OnWebBrowserNewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed) 
{ 
    // Set Processed to cancel opening of the new window. 
} 
+0

어떻게 진행률 표시 줄을 올바로 작동시키는 지 게시 할 수 있습니까? 나는 양식을 시도했지만 너무 많은 배경 지식이 부족했다. 웹 브라우저 진행 표시 줄을 작동시키기 위해 수백 페이지를 낭독하고 싶지 않습니다. 간단한 예제를 게시 할 수 있다면 고맙습니다. 감사. –

1

IWebBrowser2 인터페이스를 가져올 수는 쉬운 방법이있다 WebBrowser 클래스는 속성이 AxIWebBrowser2이고 기본 COM 브라우저 객체를 포함하지만 "내부"이므로 리플렉션을 통해 가져올 수 있습니다.

관련 문제