2010-01-14 26 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的底部有一个标题为“到本机IWebBrowser2”的评论。

这显示如何到达所需的接口,似乎运作良好。

编辑:添加链接的内容在这里作为在MSDN的意见不断消失于我..

有我们的托管包装还没有暴露本地Web浏览器控件的多的功能。以下代码片段显示如何从WPF WebBrowser控件获取IWebBrowser2接口。这允许访问该对象上未以其他方式公开显示的控件方法。但请注意,此代码示例仅适用于完全受信任的代码。

首先,看看IWebBrowser2的文档在这里:http://msdn.microsoft.com/en-us/library/aa752127.aspx ...

编译这段代码,添加一个COM引用System32\shdocvw.dllieframe.dll(无论你有,这取决于IE的版本)。

[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),像这样:

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

你可以发布你如何让进度条正常工作。我尝试了链接,但是我缺乏太多的背景知识。我不想花费数百页来阅读网页浏览器进度条。我很感激你能否发表一个简单的例子。谢谢。 – 2013-01-12 05:52:49

1

要获得IWebBrowser2接口,还有一个简单的方法:

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

WebBrowser类有一个属性AxIWebBrowser2,它拥有底层的COM浏览器对象,但它是“内部”的,所以我们可以通过反射来获得它。