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 ExplorerNewWindow2
可以正常启动,但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。您仍然可以使用.NETWeBrowser
控件,就像使用本机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;
}