C# 未激发NewWindow3事件

C# 未激发NewWindow3事件,c#,webbrowser-control,new-window,C#,Webbrowser Control,New Window,我正在尝试将NewWindow3事件与Microsoft Web浏览器控件一起使用,以便捕获URL并阻止它打开Internet ExplorerNewWindow2可以正常启动,但NewWindow3不能。我能找到的唯一相关的东西是,但我不想使用自定义控件。我想使用库存控制。在不使用自定义控件的情况下,如何使NewWindow3事件正常工作 private void Form1_Load( object sender, EventArgs e ) { webBrowser1.Naviga

我正在尝试将
NewWindow3
事件与Microsoft Web浏览器控件一起使用,以便捕获URL并阻止它打开Internet Explorer
NewWindow2
可以正常启动,但
NewWindow3
不能。我能找到的唯一相关的东西是,但我不想使用自定义控件。我想使用库存控制。在不使用自定义控件的情况下,如何使
NewWindow3
事件正常工作

private void Form1_Load( object sender, EventArgs e )
{
    webBrowser1.Navigate("http://www.stackoverflow.com");
    SHDocVw.WebBrowser browser = (SHDocVw.WebBrowser)webBrowser1.ActiveXInstance;
    Debug.Assert(browser != null);
    browser.NewWindow2 += new SHDocVw.DWebBrowserEvents2_NewWindow2EventHandler(browser_NewWindow2);
    browser.NewWindow3 += new SHDocVw.DWebBrowserEvents2_NewWindow3EventHandler(browser_NewWindow3);
}

void browser_NewWindow2( ref object ppDisp, ref bool Cancel )
{
    Debug.Write("NewWindow2");
}

private void browser_NewWindow3( ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl )
{
    Debug.Write(bstrUrl);
}

经过数周的努力,我终于明白了。我没有使用Web浏览器控件的.Net包装器,而是通过执行以下操作将Web浏览器控件添加为ActiveX COM控件:

  • 右键单击工具箱中的任何控件,然后选择“选择项…”
  • 转到COM组件选项卡并选择Microsoft Web浏览器
  • 从工具箱的“所有Windows窗体”类别中,向窗体添加一个Microsoft Web Browser控件
  • NewWindow3
    事件正常显示。无需使用
    webBrowser1.AxtiveXControl
    即可访问它
  • NewWindow3
    事件添加代码

    private void axWebBrowser1_NewWindow3( object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow3Event e )
    {
        Debug.WriteLine(e.bstrUrl);
        e.cancel = true;
    }
    

如本文所述,
尝试将引用
SHDocVw
的属性
Embed Interop Type
设置为
false

如果在调用
Navigate()
之前订阅事件会发生什么?如果您只订阅
NewWindow3
,会发生什么情况?@PeterDuniho,
webBrowser1.ActiveXInstance
返回null,我无法订阅该事件。@HansPassant,我同意不应该订阅,但它确实订阅。@HansPassant。您仍然可以使用.NET
WeBrowser
控件,就像使用本机COM控件一样,谢谢,但这似乎比只使用本机COM控件复杂得多。
    // Form_Load
this.axWebBrowser1.NewWindow3 += new AxSHDocVw.DWebBrowserEvents2_NewWindow3EventHandler(this.axWebBrowser1_NewWindow3);
this.axWebBrowser1.NewWindow2 += new AxSHDocVw.DWebBrowserEvents2_NewWindow2EventHandler(this.axWebBrowser1_NewWindow2);

object obj = null; 


private void axWebBrowser1_NewWindow2(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e)
{
      e.cancel = true;
}

private void axWebBrowser1_NewWindow3(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow3Event e)
{
      //MessageBox.Show(e.bstrUrl);
      Form1 nF = new Form1();
      nF.axWebBrowser1.RegisterAsBrowser = true;
      e.ppDisp = nF.axWebBrowser1.Application;
      nF.Visible = true;
      nF.axWebBrowser1.Navigate(e.bstrUrl, ref obj, ref obj, ref obj, ref obj);
      e.cancel = true;
}