Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Browser 用于处理应用程序内弹出窗口的Web浏览器_Browser_Webbrowser Control_Vb.net 2010_Popupwindow_Axwebbrowser - Fatal编程技术网

Browser 用于处理应用程序内弹出窗口的Web浏览器

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时,如果我继续,将出现错误:

我尝试使用WebBrowser控件为弹出窗口启动一个新表单,而不是在IE中打开。我尝试使用AxWebBrowser来获取与NewWindow3事件一起工作的弹出窗口,只需执行
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(“正在工作?”)您是对的,Winforms
WebBrowser
控件的
WindowClosing
不会被解雇,我确认这一点。这似乎是.NET
WebBrowser
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