Web浏览器来处理应用程序中的弹出窗口 [英] Web Browser to handle pop ups within the application
问题描述
我想使用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屋!