WPF WebBrowser:我如何访问进度和新窗口事件

时间:2010-01-14 11:58:08

标签: .net wpf webbrowser-control progress new-window

我正在构建一个使用WebBrowser控件的WPF应用程序 我在几点上苦苦挣扎:

  1. 如何从控件获取下载的当前进度。 WinForms WebBrowser控件引发了ProgressChange事件 - 如何使用WPF变体复制此功能?

  2. 如何捕获尝试在新窗口中打开的链接。 Winforms WebBrowser再次发生了一个NewWindow事件。我可以使用它来阻止IE启动并在同一窗口中打开链接。是否可以使用WPF变体执行此操作?

2 个答案:

答案 0 :(得分: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的版本,具体取决于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已准备好进行交互。

您还可以通过生成的托管包装器处理本机Web浏览器的事件(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.
}

答案 1 :(得分:2)

要获得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浏览器对象,但它是“内部的”,所以我们可以通过反射得到它。