Browser 用于处理应用程序内弹出窗口的Web浏览器
我尝试使用WebBrowser控件为弹出窗口启动一个新表单,而不是在IE中打开。我尝试使用AxWebBrowser来获取与NewWindow3事件一起工作的弹出窗口,只需执行Browser 用于处理应用程序内弹出窗口的Web浏览器,browser,webbrowser-control,vb.net-2010,popupwindow,axwebbrowser,Browser,Webbrowser Control,Vb.net 2010,Popupwindow,Axwebbrowser,我尝试使用WebBrowser控件为弹出窗口启动一个新表单,而不是在IE中打开。我尝试使用AxWebBrowser来获取与NewWindow3事件一起工作的弹出窗口,只需执行e.ppDisp=AxWebBrowser.Application,但AxWebBrowser有许多限制。因此,我尝试扩展普通的WebBrowser,以包括像AxWebBrowser一样的NewWindow3事件,但遇到了问题。使用e.ppDisp=AxWebBrowser.Application时,如果我继续,将出现错误:
e.ppDisp=AxWebBrowser.Application
,但AxWebBrowser有许多限制。因此,我尝试扩展普通的WebBrowser,以包括像AxWebBrowser一样的NewWindow3事件,但遇到了问题。使用e.ppDisp=AxWebBrowser.Application
时,如果我继续,将出现错误:“检测到InvalidVariant”,后跟“指定的OLE variant无效”
注意:这是我第一次扩展一个类,这样我就可以看一些简单的东西了。如果我尝试在新窗口中导航到新的URL,我会从站点中得到java脚本错误
我已经根据评论更新了代码。已删除ExtendedWebBrowser类以获得更小更好的版本。以下是新代码:
从主窗体和一个非常类似的浏览器弹出窗体-
Protected Overrides Sub OnLoad(ByVal e As EventArgs)
MyBase.OnLoad(e)
nativeBrowser = DirectCast(ExtendedWebBrowser1.ActiveXInstance, SHDocVw.WebBrowser)
AddHandler nativeBrowser.NewWindow3, AddressOf nativeBrowser_NewWindow3
AddHandler nativeBrowser.WindowClosing, AddressOf nativeBrowser_WindowClosing
End Sub
Private Sub nativeBrowser_NewWindow3(ByRef ppDisp As Object, ByRef Cancel As Boolean, ByVal dwflags As UInteger, ByVal bStrUrlContext As String, ByVal bstrUrl As String)
Dim popup = New BrowserPopup()
popup.Show(Me)
popup.browserPop.DocumentText = bStrUrlContext
ppDisp = popup.browserPop.ActiveXInstance
End Sub
Private Sub nativeBrowser_WindowClosing(ByVal IsChildWindow As Boolean, ByRef Cancel As Boolean)
MsgBox("working?") '<<<Doesn't Trigger>>>
End Sub
Protected Overrides Sub OnFormClosing(ByVal e As FormClosingEventArgs)
MyBase.OnFormClosing(e)
End Sub
Protected Overrides Sub OnLoad(ByVal e As EventArgs)
MyBase.OnLoad(e)
nativeBrowser=DirectCast(ExtendedWebBrowser1.ActiveXInstance,SHDocVw.WebBrowser)
AddHandler nativeBrowser.NewWindow3,nativeBrowser\u NewWindow3的地址
AddHandler nativeBrowser.WindowClosing,nativeBrowser\u WindowClosing的地址
端接头
Private Sub-nativeBrowser_NewWindow3(ByRef ppDisp作为对象,ByRef Cancel作为布尔值,ByVal dwflags作为UInteger,ByVal bStrUrlContext作为字符串,ByVal bstrUrl作为字符串)
Dim popup=新浏览器popup()
弹出。显示(我)
popup.browserPop.DocumentText=bStrUrlContext
ppDisp=popup.browserPop.ActiveXInstance
端接头
Private Sub-nativeBrowser_WindowClosing(ByVal IsChildWindow为布尔值,ByRef Cancel为布尔值)
MsgBox(“正在工作?”)您是对的,WinformsWebBrowser
控件的WindowClosing
不会被解雇,我确认这一点。这似乎是.NETWebBrowser
ActiveX托管代码中的一个长期错误,从未解决过。查看更多详细信息和可能的解决方法
另一种可能的解决方法是通过AxHost
类直接托管WebBrowser ActiveX控件,在这种情况下WindowClosing
可以正确启动。例如:
C#:
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WebBrowserApp
{
// MainForm
public partial class MainForm : Form
{
WebBrowser webBrowser;
public MainForm()
{
InitializeComponent();
InitBrowser();
if (this.webBrowser.Document == null && this.webBrowser.ActiveXInstance == null)
throw new ApplicationException ("Unable to initialize WebBrowser ActiveX control.");
var ax = (SHDocVw.WebBrowser)this.webBrowser.ActiveXInstance;
ax.NewWindow2 += (ref object ppDisp, ref bool Cancel) =>
{
var popup = new RawBrowserPopup();
popup.Visible = true;
ppDisp = popup.WebBrowser.ActiveXInstance;
};
this.Load += (s, e) =>
{
this.webBrowser.DocumentText = "<a target=\"_blank\" href=\"javascript:'<button onclick=\\'window.close()\\'>Close</button>'\">Go</a>";
};
}
// create a WebBrowser instance
void InitBrowser()
{
this.webBrowser = new WebBrowser();
this.webBrowser.Dock = DockStyle.Fill;
this.Controls.Add(this.webBrowser);
this.webBrowser.Visible = true;
}
}
// RawWebBrowser
public class RawWebBrowser : AxHost
{
public RawWebBrowser()
: base("8856f961-340a-11d0-a96b-00c04fd705a2")
{
}
public event EventHandler Initialized;
protected override void AttachInterfaces()
{
if (this.Initialized != null)
this.Initialized(this, new EventArgs());
}
public object ActiveXInstance
{
get
{
return base.GetOcx();
}
}
}
// RawBrowserPopup
public class RawBrowserPopup : Form
{
RawWebBrowser webBrowser;
public RawWebBrowser WebBrowser
{
get { return this.webBrowser; }
}
public RawBrowserPopup()
{
this.webBrowser = new RawWebBrowser();
this.webBrowser.Initialized += (s, e) =>
{
var ax = (SHDocVw.WebBrowser)this.webBrowser.ActiveXInstance;
ax.NewWindow2 += (ref object ppDisp, ref bool Cancel) =>
{
var popup = new RawBrowserPopup();
popup.Visible = true;
ppDisp = popup.WebBrowser.ActiveXInstance;
};
ax.WindowClosing += (bool IsChildWindow, ref bool Cancel) =>
{
Cancel = true;
this.Close();
};
};
this.webBrowser.Dock = DockStyle.Fill;
this.Controls.Add(this.webBrowser);
this.webBrowser.Visible = true;
}
}
}
Public Class Form1
Dim webBrowser As WebBrowser = New WebBrowser()
Sub New()
MyBase.New()
Me.InitializeComponent()
webBrowser.Dock = DockStyle.Fill
Me.Controls.Add(webBrowser)
webBrowser.Visible = True
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.webBrowser.DocumentText = "<a target='_blank' href='javascript:""<button onclick=\""window.close()\"">Close</button>""'>Go</a>"
Dim ActiveX As SHDocVw.WebBrowser = Me.webBrowser.ActiveXInstance
AddHandler ActiveX.NewWindow2, AddressOf WebBrowser_ActiveX_NewWindow2
End Sub
Private Sub WebBrowser_ActiveX_NewWindow2(ByRef ppDisp As Object, ByRef Cancel As Boolean)
Dim popup As RawBrowserPopup = New RawBrowserPopup()
popup.Visible = True
ppDisp = popup.WebBrowser.ActiveXInstance
End Sub
End Class
Public Class RawWebBrowser
Inherits System.Windows.Forms.AxHost
Sub New()
MyBase.New("8856f961-340a-11d0-a96b-00c04fd705a2")
End Sub
Event Initialized(sender As Object, e As EventArgs)
Protected Overrides Sub AttachInterfaces()
RaiseEvent Initialized(Me, New EventArgs())
End Sub
Public ReadOnly Property ActiveXInstance() As Object
Get
Return MyBase.GetOcx()
End Get
End Property
End Class
Public Class RawBrowserPopup
Inherits System.Windows.Forms.Form
Dim WithEvents rawBrowser As RawWebBrowser = New RawWebBrowser()
Sub New()
MyBase.New()
rawBrowser.Dock = DockStyle.Fill
Me.Controls.Add(rawBrowser)
rawBrowser.Visible = True
End Sub
Public ReadOnly Property WebBrowser() As Object
Get
Return rawBrowser
End Get
End Property
Private Sub rawBrowser_Initialized(sender As Object, e As EventArgs) Handles rawBrowser.Initialized
Dim activeX As SHDocVw.WebBrowser = rawBrowser.ActiveXInstance
AddHandler activeX.NewWindow2, AddressOf activeX_NewWindow2
AddHandler activeX.WindowClosing, AddressOf activeX_WindowClosing
End Sub
Private Sub activeX_NewWindow2(ByRef ppDisp As Object, ByRef Cancel As Boolean)
Dim popup As RawBrowserPopup = New RawBrowserPopup()
popup.Visible = True
ppDisp = popup.WebBrowser.ActiveXInstance
End Sub
Private Sub activeX_WindowClosing(IsChildWindow As Boolean, ByRef Cancel As Boolean)
Cancel = True
Me.Close()
End Sub
End Class
使用Microsoft.Win32;
使用制度;
使用系统诊断;
使用系统线程;
使用System.Threading.Tasks;
使用System.Windows.Forms;
使用System.Runtime.InteropServices;
命名空间WebBrowserApp
{
//主要形式
公共部分类主窗体:窗体
{
网络浏览器;
公共表格(
{
初始化组件();
InitBrowser();
if(this.webBrowser.Document==null&&this.webBrowser.ActiveXInstance==null)
抛出新的ApplicationException(“无法初始化WebBrowser ActiveX控件”);
var ax=(SHDocVw.WebBrowser)this.WebBrowser.ActiveXInstance;
ax.NewWindow2+=(参考对象ppDisp,参考布尔取消)=>
{
var popup=新的RawBrowserPopup();
popup.Visible=true;
ppDisp=popup.WebBrowser.ActiveXInstance;
};
这个.Load+=(s,e)=>
{
this.webBrowser.DocumentText=“”;
};
}
//创建WebBrowser实例
void InitBrowser()
{
this.webBrowser=新的webBrowser();
this.webBrowser.Dock=DockStyle.Fill;
this.Controls.Add(this.webBrowser);
this.webBrowser.Visible=true;
}
}
//罗维布朗瑟
公共类RawWebBrowser:AxHost
{
公共网络浏览器()
:底座(“8856f961-340a-11d0-a96b-00c04fd705a2”)
{
}
已初始化公共事件事件处理程序;
受保护的覆盖无效连接接口()
{
如果(this.Initialized!=null)
this.Initialized(this,new EventArgs());
}
公共对象活动状态
{
得到
{
return base.GetOcx();
}
}
}
//RawBrowser弹出窗口
公共类RawBrowserPopup:表单
{
韦伯罗瑟;
公共网络浏览器
{
获取{返回this.webBrowser;}
}
公共RawBrowserPopup()
{
this.webBrowser=新的RawWebBrowser();
this.webBrowser.Initialized+=(s,e)=>
{
var ax=(SHDocVw.WebBrowser)this.WebBrowser.ActiveXInstance;
ax.NewWindow2+=(参考对象ppDisp,参考布尔取消)=>
{
var popup=新的RawBrowserPopup();
popup.Visible=true;
ppDisp=popup.WebBrowser.ActiveXInstance;
};
ax.WindowClosing+=(bool IsChildWindow,ref bool Cancel)=>
{
取消=真;
这个。关闭();
};
};
this.webBrowser.Dock=DockStyle.Fill;
this.Controls.Add(this.webBrowser);
this.webBrowser.Visible=true;
}
}
}
VB.NET:
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WebBrowserApp
{
// MainForm
public partial class MainForm : Form
{
WebBrowser webBrowser;
public MainForm()
{
InitializeComponent();
InitBrowser();
if (this.webBrowser.Document == null && this.webBrowser.ActiveXInstance == null)
throw new ApplicationException ("Unable to initialize WebBrowser ActiveX control.");
var ax = (SHDocVw.WebBrowser)this.webBrowser.ActiveXInstance;
ax.NewWindow2 += (ref object ppDisp, ref bool Cancel) =>
{
var popup = new RawBrowserPopup();
popup.Visible = true;
ppDisp = popup.WebBrowser.ActiveXInstance;
};
this.Load += (s, e) =>
{
this.webBrowser.DocumentText = "<a target=\"_blank\" href=\"javascript:'<button onclick=\\'window.close()\\'>Close</button>'\">Go</a>";
};
}
// create a WebBrowser instance
void InitBrowser()
{
this.webBrowser = new WebBrowser();
this.webBrowser.Dock = DockStyle.Fill;
this.Controls.Add(this.webBrowser);
this.webBrowser.Visible = true;
}
}
// RawWebBrowser
public class RawWebBrowser : AxHost
{
public RawWebBrowser()
: base("8856f961-340a-11d0-a96b-00c04fd705a2")
{
}
public event EventHandler Initialized;
protected override void AttachInterfaces()
{
if (this.Initialized != null)
this.Initialized(this, new EventArgs());
}
public object ActiveXInstance
{
get
{
return base.GetOcx();
}
}
}
// RawBrowserPopup
public class RawBrowserPopup : Form
{
RawWebBrowser webBrowser;
public RawWebBrowser WebBrowser
{
get { return this.webBrowser; }
}
public RawBrowserPopup()
{
this.webBrowser = new RawWebBrowser();
this.webBrowser.Initialized += (s, e) =>
{
var ax = (SHDocVw.WebBrowser)this.webBrowser.ActiveXInstance;
ax.NewWindow2 += (ref object ppDisp, ref bool Cancel) =>
{
var popup = new RawBrowserPopup();
popup.Visible = true;
ppDisp = popup.WebBrowser.ActiveXInstance;
};
ax.WindowClosing += (bool IsChildWindow, ref bool Cancel) =>
{
Cancel = true;
this.Close();
};
};
this.webBrowser.Dock = DockStyle.Fill;
this.Controls.Add(this.webBrowser);
this.webBrowser.Visible = true;
}
}
}
Public Class Form1
Dim webBrowser As WebBrowser = New WebBrowser()
Sub New()
MyBase.New()
Me.InitializeComponent()
webBrowser.Dock = DockStyle.Fill
Me.Controls.Add(webBrowser)
webBrowser.Visible = True
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.webBrowser.DocumentText = "<a target='_blank' href='javascript:""<button onclick=\""window.close()\"">Close</button>""'>Go</a>"
Dim ActiveX As SHDocVw.WebBrowser = Me.webBrowser.ActiveXInstance
AddHandler ActiveX.NewWindow2, AddressOf WebBrowser_ActiveX_NewWindow2
End Sub
Private Sub WebBrowser_ActiveX_NewWindow2(ByRef ppDisp As Object, ByRef Cancel As Boolean)
Dim popup As RawBrowserPopup = New RawBrowserPopup()
popup.Visible = True
ppDisp = popup.WebBrowser.ActiveXInstance
End Sub
End Class
Public Class RawWebBrowser
Inherits System.Windows.Forms.AxHost
Sub New()
MyBase.New("8856f961-340a-11d0-a96b-00c04fd705a2")
End Sub
Event Initialized(sender As Object, e As EventArgs)
Protected Overrides Sub AttachInterfaces()
RaiseEvent Initialized(Me, New EventArgs())
End Sub
Public ReadOnly Property ActiveXInstance() As Object
Get
Return MyBase.GetOcx()
End Get
End Property
End Class
Public Class RawBrowserPopup
Inherits System.Windows.Forms.Form
Dim WithEvents rawBrowser As RawWebBrowser = New RawWebBrowser()
Sub New()
MyBase.New()
rawBrowser.Dock = DockStyle.Fill
Me.Controls.Add(rawBrowser)
rawBrowser.Visible = True
End Sub
Public ReadOnly Property WebBrowser() As Object
Get
Return rawBrowser
End Get
End Property
Private Sub rawBrowser_Initialized(sender As Object, e As EventArgs) Handles rawBrowser.Initialized
Dim activeX As SHDocVw.WebBrowser = rawBrowser.ActiveXInstance
AddHandler activeX.NewWindow2, AddressOf activeX_NewWindow2
AddHandler activeX.WindowClosing, AddressOf activeX_WindowClosing
End Sub
Private Sub activeX_NewWindow2(ByRef ppDisp As Object, ByRef Cancel As Boolean)
Dim popup As RawBrowserPopup = New RawBrowserPopup()
popup.Visible = True
ppDisp = popup.WebBrowser.ActiveXInstance
End Sub
Private Sub activeX_WindowClosing(IsChildWindow As Boolean, ByRef Cancel As Boolean)
Cancel = True
Me.Close()
End Sub
End Class
公共类表单1
将webBrowser变暗为webBrowser=新webBrowser()
次新
MyBase.New()
Me.InitializeComponent()的缩写
webBrowser.Dock=DockStyle.Fill
Me.Controls.Add(webBrowser)
webBrowser.Visible=True
端接头
私有子表单1_Load(发送方作为对象,e作为事件参数)处理MyBase.Load
Me.webBrowser.DocumentText=“”
将ActiveX设置为SHDocVw.WebBrowser=Me.WebBrowser.ActiveXInstance
AddHandler ActiveX.NewWindow2,WebBrowser\u ActiveX\u NewWindow2的地址
端接头
专用子网络浏览器\u ActiveX\u新窗口2(ByRef pp