1. 对于新打开的窗口,在打开时会触发WebBrowser的NewWindow3事件,触发该事件有以下几种操作:
1) 按住SHIFT或CTRL键时点击鼠标;
2) 在链接的右键菜单中选择“在新窗口中打开”或“在新标签中打工”;
3) 链接的目标窗口不存在或者为“_blank“;
4) Javascript的windows.open函数调用;
5) 在调用Navigate 或 Navigate2 时,设置了navOpenInNewWindow标志位;
在自定义的窗口中使用WebBrowser控件时,可以捕捉该事件,然后创建新的窗口,在窗口中打开指定的链接;但.NET实现的WebBrowser控件没有给出该事件的接口,我们需要扩展该控件。
STEP 1:定义扩展的WebBrowser控件
public class ExWebBrowser : System.Windows.Forms.WebBrowser
{ // ……
}
STEP 2: 定义浏览器窗口类:
窗口中有一个ExtWebBrowser控件browser,然后一个地址栏输入框txtURL,一个用于打开页面的按钮btnGo。
public partial class ExWebBrowserForm : Form
{
public ExWebBrowserForm( )
{
InitializeComponent( );
}
public ExWebBrowser Browser
{
get { return null; }
}
private void btnGo_Click(object sender, EventArgs e)
{
try {
_browser.Navigate(txtURL.Text);
} catch (Exception ex) {
MessageBox.Show(ex.ToString( ), ex.Message);
}
}
}
STEP 3:定义要实现的事件接口
还有其它事件,可以在此处定义,但我们目前只关注NewWindow3一个事件,必要时在该接口中增加即可。
[ComImport, TypeLibType((short)0x1010), InterfaceType((short)2), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D")]
public interface IWebBrowserEvents2
{
[PreserveSig, MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x111)]
void NewWindow3([In, Out, MarshalAs(UnmanagedType.IDispatch)] ref object ppDisp, [In, Out] ref bool Cancel, [In] uint dwFlags, [In, MarshalAs(UnmanagedType.BStr)] string bstrUrlContext, [In, MarshalAs(UnmanagedType.BStr)] string bstrUrl);
}
STEP 4:实现事件接口
在捕捉到NewWindow3事件后创建一个新的窗口,然后在新窗口的ExWebBrowser控件中打开指定的页面。
class WebBrowserExtendedEvents : IWebBrowserEvents2
{
private ExWebBrowser _browser = null;
public WebBrowserExtendedEvents(ExWebBrowser browser) { _browser = browser; }
private object PopupWindow( )
{
ExWebBrowserForm form = new ExWebBrowserForm( );
form.Text += " -- " + form.Browser.Url ?? string.Empty;
form.Visible = true;
form.Show( );
return form.Browser.ApplicationObject;
}
// NewWindow3 event, used on Windows XP SP2 and higher
public void NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl)
{
Cancel = _browser.DisablePopupWindow;
if (!Cancel)
ppDisp = PopupWindow( ) ;
}
}
STEP 5:为ExWebBrowser附件实现的IWebBrowserEvents2接口
此处增加了一个属性DisablePopupWindow,该属性用于控制是否禁止弹出窗口。
public class ExWebBrowser : System.Windows.Forms.WebBrowser
{
private IWebBrowser2 axIWebBrowser2;
private bool _diablePopupWindow = false;
private WebBrowserExtendedEvents events = null;
private System.Windows.Forms.AxHost.ConnectionPointCookie cookie;
public bool DisablePopupWindow
{
get { return _diablePopupWindow; }
set { _diablePopupWindow = value; }
}
// 该方法由系统自动调用,从该函数的调用中截获到IWebBrowser2接口
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void AttachInterfaces(object nativeActiveXObject)
{
this.axIWebBrowser2 = (IWebBrowser2)nativeActiveXObject;
base.AttachInterfaces(nativeActiveXObject);
}
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void DetachInterfaces( )
{
this.axIWebBrowser2 = null;
base.DetachInterfaces( );
}
// 返回WebBrowser的自动化对象
public object ApplicationObject
{
get { return axIWebBrowser2.Application; }
}
// 此方法增加自定义的事件对象
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void CreateSink( )
{
// 一定在此调用基类的方法,否则WebBrowser自己实现的事件就不能触发了
base.CreateSink( );
events = new WebBrowserExtendedEvents(this);
cookie = new AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(IWebBrowserEvents2));
}
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void DetachSink( )
{
if (null != cookie) {
cookie.Disconnect( );
cookie = null;
}
}
}
STEP 6:主程序
主程序很简单,就是创建一个浏览器窗口。由于我是在现有的一个工程中写的主函数,基于控制台的,如果创建windows程序在主程序中使用Application.Run(new ExWebBrowserForm() )就可以了。
class Program
{
[STAThread]
static int Main(string[] args)
{
ExWebBrowserForm browser = new ExWebBrowserForm( );
browser.ShowDialog( );
}
}
其实,原理很简单,因为.NET Framework中实现WebBrowser时,很多IE的事件或方法都没有定义出来,需要时只能通过AttachInterfaces把相应的接口附上,通过这个方法,我们就可以有选择性地对我们关心的接口进行实现。
我们一旦获取了一个包含子窗口的WebBrowser控件,就可以在程序中通过该控件进行任何自动化的操作了。
但对于showModalDialog( )和showModelessDialog( )弹出是就没有NewWindow3事件了,下一篇中再讨论这两个窗口的弹出问题。
分享到:
相关推荐
版本:Cef_115.0.5790.32 平台:Windows32 VS版本:VS2022 构建:Debug, Release CEF版本:115 Chormium版本:115 分支:5790 test工程:cefclient,cefsimple,ceftests,gtest,shared
资源名称:cef_binary_101.0.18+g367b4a0+chromium-101.0.4951.67_windows32_minimal.zip 版本:101.0.4951.67 构建环境:Win 10+ deployment, Win 10+ build system w/ VS2019 16.11.13+, Win 10.0.20348 SDK, ...
实例313——在对话框中,使用WebBrowser控件实现Web浏览器
WPF-进阶视频教程(共113集)-061WebBrowser控件.mp4
基于Chromium构建Chrome WebBrowser for .net 控件,里面有程序源代码、demo、文档。资料很齐全。
VB6.0 WebBrowser阻止弹出窗口的3个办法
•Add support for the TWebBrowser component - Vcl.Styles.WebBrowser page. •Add support for the Standard Windows dialogs and Menus - Vcl.Styles.SysControls page. •Additional Style Hooks for Forms - ...
包括Chromium最新版本(CEF-3.2623.1401,支持delphi 10 Seattle)及支持xe3的老版本(自带双核浏览器样例),可代替webbrowser浏览器, 支持html5,与UC/360浏览器同等内核,是开发WEB终端显示最好用的浏览器组件!
WebBrowser关闭弹出的alert对话框
2023年刚发布的用于开发linux桌面的工具,支持delphi 10、11版本。 FMUX.Api FMUX.Config FMX.WebBrowser.Linux Linux.OpenGL System.Contnrs System.Devices System.Linux.Devices System.Permissions
VB语言源码!网络语音系统代码,局域网消息发送器 下一个:远程控制程序的源代码 局域网语音大厅系统
1,在项目中引用程序集拓展中的Microsoft.mshtml后,可以在公共控件中找到WebBrowser控件。 2,在窗体中加入三个按钮,然后添加WebBrowser控件,右键控件选属性,设置相应的属性。 3,设置WebBrowser控件的属性 ...
基于Chromium构建Chrome WebBrowser for .net 控件,里面有程序源代码、demo、文档。资料很齐全。
浏览器 For iOS https://github.com/zhongwuzw/WebBrowser
WebBrowser1.宽度 = 取用户区宽度 () - WebBrowser1.左边 - 8 连续赋值 (取用户区高度 () - 超级列表框1.顶边 - 8, 超级列表框1.高度, WebBrowser1.高度) 按钮2.左边 = 取用户区宽度 () - 8 - 按钮2.宽度 ...
自动点击WebBrowser,ie等弹出的alert确定,
计算机软件-商业源码-利用WebBrowser.Control实现程序界面与实现的分离.zip
WebBrowser控件应用:弹出新窗体和关闭窗口
在EO浏览器中创建有用和漂亮的卫星可视化教程
获取网页源码数据的4种方法(VBA) XMLHTTP/IE/QueryTables/WebBrowser