Web浏览器来处理应用程序中的弹出窗口 [英] Web Browser to handle pop ups within the application

查看:609
本文介绍了Web浏览器来处理应用程序中的弹出窗口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用WebBrowser控件推出一个新的形式弹出,而不是它在IE中打开。我曾尝试使用AxWebBrowser,而不是得到它与NewWindow3事件和工作只是做 e.ppDisp = AxWebBrowser.Application 的弹出窗口,但也有配备AxWebBrowser许多限制。所以不是我试图延长正常的web浏览器,以包括NewWindow3事件像AxWebBrowser但遇到了问题。随着 e.ppDisp = AxWebBrowser.Application 我收到错误:InvalidVariant检测,其次是指定的OLE变量无效如果我继续。

请注意:这是我第一次扩展一个类,所以我可以俯瞰简单的东西。如果我尝试只是导航到新的URL在新窗口中,我得到的Java脚本错误从网站。

我已经更新上的评论code基地。已经删除了ExtendedWebBrowser类的蒙克更小,更好的版本。这是新的code:

在主窗体和一个非常相似的BrowserPopup形式 -

 受保护的覆盖小组的OnLoad(BYVAL E上的EventArgs)
    MyBase.OnLoad(五)
    nativeBrowser = DirectCast(ExtendedWebBrowser1.ActiveXInstance,SHDocVw.WebBrowser)
    AddHandler的nativeBrowser.NewWindow3,AddressOf nativeBrowser_NewWindow3
    AddHandler的nativeBrowser.WindowClosing,AddressOf nativeBrowser_WindowClosing
结束小组私人小组nativeBrowser_NewWindow3(为ByRef ppDisp为对象,为ByRef取消为布尔,BYVAL dwFlags中作为UInteger,BYVAL bStrUrlContext作为字符串,BYVAL bstrUrl作为字符串)
    昏暗的弹出=新BrowserPopup()
    popup.Show(ME)
    popup.browserPop.DocumentText = bStrUrlContext
    ppDisp = popup.browserPop.ActiveXInstance
结束小组私人小组nativeBrowser_WindowClosing(BYVAL IsChildWindow由于布尔,为ByRef取消由于布尔)
    MSGBOX(工作?)'<<<不会触发>>>
结束小组受保护的覆盖子OnFormClosing(BYVAL E上FormClosingEventArgs)
    MyBase.OnFormClosing(五)
结束小组

此外,如果有帮助,下面是应该能够关闭弹出窗体页的脚本,但似乎只是停用web浏览器来代替。

 <表isListBtn =假的cellpadding =0已启用=真正的类=buttonBorderBlue
CELLSPACING =0边界=0的onClick =如果(typeof运算(workpaneMediator_toolbar)!=未定义)
workpaneMediator_toolbar.onSelect('CANCEL_ACTION',这一点)
操作类型=CLOSE_WINDOW_TYPEID =workpaneMediator_toolbar_CANCEL_ACTIONWrapper
NOWRAP>< TR>< TD类=buttonBlueTD>


解决方案

您说得对,的windowClosing 不会被解雇的WinForms web浏览器控制,我确认。这似乎是在.NET中经过较长时间的错误 web浏览器的ActiveX托管code,它从来没有得到解决。检查<一href=\"http://social.msdn.microsoft.com/Forums/vstudio/en-US/211058d5-f052-49ef-aab5-38baf5b3703e/windowclosing-event-does-not-fire-with-the-webbrowser-control-in-c-20?forum=csharpgeneral\"相对=nofollow>这个帖子了解更多的细节和可能的解决方法。

另一个可能的解决方法是直接通过 AxHost举办的WebBrowser ActiveX控件类,在这种情况下,的windowClosing 变火正确。例如:

C#:

 使用的Microsoft.Win32;
使用系统;
使用System.Diagnostics程序;
使用的System.Threading;
使用System.Threading.Tasks;
使用System.Windows.Forms的;
使用System.Runtime.InteropServices;命名空间WebBrowserApp
{
    //的MainForm    公共部分类的MainForm:表格
    {
        web浏览器web浏览器;        公众的MainForm()
        {
            的InitializeComponent();
            InitBrowser();            如果(this.webBrowser.Document == NULL和放大器;&安培; this.webBrowser.ActiveXInstance == NULL)
                抛出新ApplicationException的(无法初始化的WebBrowser ActiveX控件。);            变种AX =(SHDocVw.WebBrowser)this.webBrowser.ActiveXInstance;
            ax.NewWindow2 + =(Ref对象ppDisp,裁判布尔取消)=&GT;
            {
                VAR弹出=新RawBrowserPopup();
                popup.Visible = TRUE;
                ppDisp = popup.WebBrowser.ActiveXInstance;
            };            this.Load + =(S,E)=&GT;
            {
                this.webBrowser.DocumentText =&LT;目标= \\_空白\\的href = \\的javascript:'&LT;按钮的onclick = \\\\'window.close()的\\\\'&GT;关闭&LT; /按钮&GT;'\\ &GT; GO&LT; / A&gt;中;
            };
        }        //创建一个web浏览器实例
        无效InitBrowser()
        {
            this.webBrowser =新的WebBrowser();
            this.webBrowser.Dock = DockStyle.Fill;
            this.Controls.Add(this.webBrowser);
            this.webBrowser.Visible = TRUE;
        }
    }    // RawWebBrowser    公共类RawWebBrowser:AxHost
    {
        公共RawWebBrowser()
            :基地(8856f961-340a-11D0-A96B-00c04fd705a2)
        {
        }        公共事件的EventHandler初始化;        保护覆盖无效AttachInterfaces()
        {
            如果(this.Initialized!= NULL)
                this.Initialized(这一点,新的EventArgs());
        }        公共对象ActiveXInstance
        {
            得到
            {
                返回base.GetOcx();
            }
        }
    }    // RawBrowserPopup    公共类RawBrowserPopup:表单
    {
        RawWebBrowser web浏览器;        公共RawWebBrowser web浏览器
        {
            {返回this.webBrowser; }
        }        公共RawBrowserPopup()
        {
            this.webBrowser =新RawWebBrowser();            this.webBrowser.Initialized + =(S,E)=&GT;
            {
                变种AX =(SHDocVw.WebBrowser)this.webBrowser.ActiveXInstance;
                ax.NewWindow2 + =(Ref对象ppDisp,裁判布尔取消)=&GT;
                {
                    VAR弹出=新RawBrowserPopup();
                    popup.Visible = TRUE;
                    ppDisp = popup.WebBrowser.ActiveXInstance;
                };                ax.WindowClosing + =(布尔IsChildWindow,楼盘布尔取消)=&GT;
                {
                    取消= TRUE;
                    this.Close();
                };
            };            this.webBrowser.Dock = DockStyle.Fill;
            this.Controls.Add(this.webBrowser);
            this.webBrowser.Visible = TRUE;
        }
    }
}

VB.NET:

 公共类Form1的
    昏暗的web浏览器作为web浏览器=新web浏览器()    亚新()
        MyBase.New()
        Me.InitializeComponent()
        webBrowser.Dock = DockStyle.Fill
        Me.Controls.Add(网页浏览器)
        webBrowser.Visible = TRUE
    结束小组    私人小组Form1_Load的(发送者为对象,E作为EventArgs的)把手MyBase.Load
        Me.webBrowser.DocumentText =&LT;目标='_空白HREF =JavaScript的:&LT;按钮的onclick = \\window.close()的\\&GT;关闭&LT; /按钮&gt;中'&GT;去&LT; / A&gt;中        昏暗的ActiveX作为SHDocVw.WebBrowser = Me.webBrowser.ActiveXInstance
        AddHandler的ActiveX.NewWindow2,AddressOf WebBrowser_ActiveX_NewWindow2
    结束小组    私人小组WebBrowser_ActiveX_NewWindow2(为ByRef ppDisp为对象,为ByRef取消由于布尔)
        昏暗的弹出作为RawBrowserPopup =新RawBrowserPopup()
        popup.Visible = TRUE
        ppDisp = popup.WebBrowser.ActiveXInstance
    结束小组
末级公共类RawWebBrowser
    继承System.Windows.Forms.AxHost    亚新()
        MyBase.New(8856f961-340a-11D0-A96B-00c04fd705a2)
    结束小组    事件初始化(发送者为对象,E作为EventArgs的)    受保护的覆盖子AttachInterfaces()
        初始化的RaiseEvent(ME,新的EventArgs())
    结束小组    公共只读属性ActiveXInstance()作为对象
        得到
            返回MyBase.GetOcx()
        到底得的
    高端物业
末级公共类RawBrowserPopup
    继承System.Windows.Forms.Form中    昏暗WithEvents就rawBrowser作为RawWebBrowser =新RawWebBrowser()    亚新()
        MyBase.New()
        rawBrowser.Dock = DockStyle.Fill
        Me.Controls.Add(rawBrowser)
        rawBrowser.Visible = TRUE
    结束小组    公共只读属性web浏览器()作为对象
        得到
            返回rawBrowser
        到底得的
    高端物业    私人小组rawBrowser_Initialized(发送者为对象,E作为EventArgs的)把手rawBrowser.Initialized
        昏暗的ActiveX作为SHDocVw.WebBrowser = rawBrowser.ActiveXInstance
        AddHandler的activeX.NewWindow2,AddressOf activeX_NewWindow2
        AddHandler的activeX.WindowClosing,AddressOf activeX_WindowClosing
    结束小组    私人小组activeX_NewWindow2(为ByRef ppDisp为对象,为ByRef取消由于布尔)
        昏暗的弹出作为RawBrowserPopup =新RawBrowserPopup()
        popup.Visible = TRUE
        ppDisp = popup.WebBrowser.ActiveXInstance
    结束小组    私人小组activeX_WindowClosing(IsChildWindow为布尔,为ByRef取消由于布尔)
        取消= TRUE
        Me.Close()
    结束小组末级

I am trying to use the WebBrowser control to launch a new form for popups instead of it opening in IE. I have tried to use the AxWebBrowser instead to get the popups which works with NewWindow3 event and just doing e.ppDisp = AxWebBrowser.Application, but there are many limitations that come with AxWebBrowser. So instead I am trying to Extend the normal WebBrowser to include the NewWindow3 event like the AxWebBrowser but running into problems. With e.ppDisp = AxWebBrowser.Application I am getting errors: "InvalidVariant was detected" followed by "Specified OLE variant is invalid" if I continue.

Note: This is my first time extending a class so I could be over looking something simple. If I try just navigating to the new URL in the new window, I get java script errors from the site.

I have updated the code base on comments. Have removed the ExtendedWebBrowser class for a munch smaller and nicer version. Here is the New Code:

From the main form and a very similar BrowserPopup form -

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

Also, if it helps, here is the scripting from the page that should be able to close the popup form but just seems to deactivate the WebBrowser instead.

<table isListBtn="false" cellpadding="0" enabled="true" class="buttonBorderBlue"
cellspacing="0" border="0" onClick="if (typeof(workpaneMediator_toolbar)!='undefined')
workpaneMediator_toolbar.onSelect('CANCEL_ACTION', this)"
actionType="CLOSE_WINDOW_TYPE" id="workpaneMediator_toolbar_CANCEL_ACTIONWrapper"
nowrap><tr><td class="buttonBlueTD">

解决方案

You're right that WindowClosing doesn't get fired for Winforms WebBrowser Control, I confirm that. It appears to be a long-time bug in .NET WebBrowser ActiveX hosting code, which has never been addressed. Check this post for more details and a possible workaround.

Another possible workaround may be to host WebBrowser ActiveX Control directly via AxHost class, in which case WindowClosing gets fire correctly. Example:

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;
        }
    }
}

VB.NET:

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

这篇关于Web浏览器来处理应用程序中的弹出窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆