利用WebBrower封装的自己的浏览器MyIE源代码
用途:封装只能访问自己的web应用
解决问题:
1、弹出窗口不会跳出,解决了出现IE浏览器的问题
2、获得访问界面的Title作为浏览器的Title
原代码下载地址:http://download.csdn.net/detail/jsyhello/3642313
一、封装WebBrowser(源自互联网网友提供的代码,已不知出处,非常感谢)
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace MyQuery.MyBrower
{
[ComVisible(true)]
public class ExWebBrowser : System.Windows.Forms.WebBrowser
{
private SHDocVw.IWebBrowser2 Iwb2;
protected override void AttachInterfaces(object nativeActiveXObject)
{
Iwb2 = (SHDocVw.IWebBrowser2)nativeActiveXObject;
Iwb2.Silent = true;
base.AttachInterfaces(nativeActiveXObject);
}
protected override void DetachInterfaces()
{
Iwb2 = null;
base.DetachInterfaces();
}
System.Windows.Forms.AxHost.ConnectionPointCookie cookie;
WebBrowserExtendedEvents events;
//This method will be called to give you a chance to create your own event sink
protected override void CreateSink()
{
//MAKE SURE TO CALL THE BASE or the normal events won't fire
base.CreateSink();
events = new WebBrowserExtendedEvents(this);
cookie = new System.Windows.Forms.AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(DWebBrowserEvents2));
}
protected override void DetachSink()
{
if (null != cookie)
{
cookie.Disconnect();
cookie = null;
}
base.DetachSink();
}
//This new event will fire when the page is navigating
public event EventHandler BeforeNavigate;
/// <summary>
/// 可用于替代原来的NewWindow事件,新增了事件的Url参数支持。
/// </summary>
[CategoryAttribute("操作"), DescriptionAttribute("经过扩展的NewWindow事件,使用继承后的WebBrowserExtendedNavigatingEventArgs类型参数实现Url参数支持")]
public event EventHandler BeforeNewWindow;
protected void OnBeforeNewWindow(string url, out bool cancel)
{
EventHandler h = BeforeNewWindow;
WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, null);
if (null != h)
{
h(this, args);
}
cancel = args.Cancel;
}
protected void OnBeforeNavigate(string url, string frame, out bool cancel)
{
EventHandler h = BeforeNavigate;
WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, frame);
if (null != h)
{
h(this, args);
}
//Pass the cancellation chosen back out to the events
cancel = args.Cancel;
}
//This class will capture events from the WebBrowser
class WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, DWebBrowserEvents2
{
ExWebBrowser _Browser;
public WebBrowserExtendedEvents(ExWebBrowser browser) { _Browser = browser; }
//Implement whichever events you wish
public void BeforeNavigate2(object pDisp, ref object URL, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel)
{
_Browser.OnBeforeNavigate((string)URL, (string)targetFrameName, out cancel);
}
public void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL)
{
_Browser.OnBeforeNewWindow((string)URL, out cancel);
}
}
[System.Runtime.InteropServices.ComImport(), System.Runtime.InteropServices.Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),
System.Runtime.InteropServices.InterfaceTypeAttribute(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIDispatch),
System.Runtime.InteropServices.TypeLibType(System.Runtime.InteropServices.TypeLibTypeFlags.FHidden)]
public interface DWebBrowserEvents2
{
[System.Runtime.InteropServices.DispId(250)]
void BeforeNavigate2(
[System.Runtime.InteropServices.In,
System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp,
[System.Runtime.InteropServices.In] ref object URL,
[System.Runtime.InteropServices.In] ref object flags,
[System.Runtime.InteropServices.In] ref object targetFrameName, [System.Runtime.InteropServices.In] ref object postData,
[System.Runtime.InteropServices.In] ref object headers,
[System.Runtime.InteropServices.In,
System.Runtime.InteropServices.Out] ref bool cancel);
[System.Runtime.InteropServices.DispId(273)]
void NewWindow3(
[System.Runtime.InteropServices.In,
System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp,
[System.Runtime.InteropServices.In, System.Runtime.InteropServices.Out] ref bool cancel,
[System.Runtime.InteropServices.In] ref object flags,
[System.Runtime.InteropServices.In] ref object URLContext,
[System.Runtime.InteropServices.In] ref object URL);
}
}
public class WebBrowserExtendedNavigatingEventArgs : CancelEventArgs
{
private string _Url;
public string Url
{
get { return _Url; }
}
private string _Frame;
public string Frame
{
get { return _Frame; }
}
public WebBrowserExtendedNavigatingEventArgs(string url, string frame)
: base()
{
_Url = url;
_Frame = frame;
}
}
}
二、自己定义的窗体
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using MyQuery.MyBrower;
using System.IO;
using System.Net;
using System.Diagnostics;
namespace MyQuery.MyIE
{
public partial class frmBrower : Form
{
private string url = "http://www.baidu.com";
private bool isError = false;
public frmBrower()
{
InitializeComponent();
}
private void frmBrower_Load(object sender, EventArgs e)
{
this.Text = "加载中......";
try
{
toolStripProgressBar1.Visible = true;
//把自己的网址加入本地安全域中
RegistryKey reg = Registry.CurrentUser;
RegistryKey regSet = reg.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Domains", true);
int p = url .IndexOf("://");
string ip = url.Substring(p + 3);
string http = url.Substring(0, p);
RegistryKey regSetUrl = regSet.OpenSubKey(ip);
if (regSetUrl == null)
{
regSetUrl = regSet.CreateSubKey(ip);
regSetUrl.SetValue(http, 1, RegistryValueKind.DWord);
}
regSetUrl.Close();
regSet.Close();
reg.Close();
this.Enabled = false;
exWebBrowser1.AllowWebBrowserDrop = false;
exWebBrowser1.WebBrowserShortcutsEnabled = false;
exWebBrowser1.ScriptErrorsSuppressed = false;
exWebBrowser1.Navigate(url);
exWebBrowser1.IsWebBrowserContextMenuEnabled = false;
exWebBrowser1.NewWindow += new CancelEventHandler(exWebBrowser1_NewWindow);
((SHDocVw.DWebBrowserEvents_Event)exWebBrowser1.ActiveXInstance).NewWindow += BrowserNewWindow;
exWebBrowser1.BeforeNewWindow += new EventHandler(exWebBrowser1_BeforeNewWindow);
exWebBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(exWebBrowser1_DocumentCompleted);
exWebBrowser1.ProgressChanged += new WebBrowserProgressChangedEventHandler(exWebBrowser1_ProgressChanged);
while (exWebBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
toolStripProgressBar1.Visible = false;
string title = exWebBrowser1.Document.Title;
if (title.IndexOf("无法找到资源") == 0 || title.IndexOf("导航已取消") == 0
|| title.IndexOf("404") == 0 || title.IndexOf("编译错误") == 0
|| title.IndexOf("错误提示") == 0)
{
MessageBox.Show("连接服务器失败,请检查网络是否正常", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
isError = true;
this.Close();
}
else
{
this.Enabled = true;
this.Text = title;
isError = false;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
isError = true;
this.Close();
}
}
void exWebBrowser1_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
{
Application.DoEvents();
if ((e.CurrentProgress > 0) && (e.MaximumProgress > 0))
{
toolStripProgressBar1.Visible = true;
}
else if (exWebBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
toolStripProgressBar1.Visible = false;
}
}
void exWebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (exWebBrowser1.ReadyState > WebBrowserReadyState.Interactive)
{
foreach (HtmlElement f in exWebBrowser1.Document.Links)
{
string s = f.GetAttribute("target");
if (s != null && s.ToLower() == "_blank") f.SetAttribute("target", "_self");
}
this.Text = exWebBrowser1.Document.Title;
toolStripProgressBar1.Visible = false;
}
}
void exWebBrowser1_BeforeNewWindow(object sender, EventArgs e)
{
WebBrowserExtendedNavigatingEventArgs eventArgs = e as WebBrowserExtendedNavigatingEventArgs;
if (eventArgs.Url.ToLower() != "about:blank")
{
exWebBrowser1.Navigate(eventArgs.Url);
}
eventArgs.Cancel = true;
}
void Window_Error(object sender, HtmlElementErrorEventArgs e)
{
e.Handled = true;
}
void exWebBrowser1_NewWindow(object sender, CancelEventArgs e)
{
e.Cancel = true;
}
void BrowserNewWindow(string url, int flag, string target, ref object data,
string header, ref bool processed)
{
processed = true;
exWebBrowser1.Navigate(url, null, (byte[])data, header);
}
private void frmBrower_FormClosed(object sender, FormClosedEventArgs e)
{
exWebBrowser1.Dispose();
GC.WaitForPendingFinalizers();
GC.Collect();
}
private void frmBrower_FormClosing(object sender, FormClosingEventArgs e)
{
this.Enabled = false;
}
}
}
利用WebBrower封装的自己的浏览器MyIE源代码相关推荐
- 利用属性封装复杂的选项
1.考虑这样一个场景. 我们的程序中有一个"选项"窗口,这个窗口包含很多选项.其中有一个选项是单选类型的,用户可以从N个选项值中选择一个. 我们需要在用户单击"确定&qu ...
- 封装时间转换工具类_利用swig封装C++的dll为C#方便使用
使用C++开发界面,时间效率上来说,不如C#开发的快和方便.但是CTP的库是C++的,并没有C#的库,网上也有人用C#的PINVOKE的方式将C++的函数一个个转换为C#能用的接口,我是看了下,原理o ...
- 利用Vivado封装DCP文件基本流程
1.1 利用Vivado封装DCP文件基本流程 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)利用Vivado封装DCP文件基本流程: 5)结束语. 1.1.2 本节引 ...
- c# string 转 datetime_利用swig封装C++的dll为C#方便使用
使用C++开发界面,时间效率上来说,不如C#开发的快和方便.但是CTP的库是C++的,并没有C#的库,网上也有人用C#的PINVOKE的方式将C++的函数一个个转换为C#能用的接口,我是看了下,原理o ...
- JS 利用promise封装setTimeout So easy
JS 利用promise封装setTimeout So easy 就是一句代码那么简单 , 实际应用可以结合async / await~ /*** @description:延迟|等待函数* @ret ...
- Python开发工具系列1------基于业务常见情况,利用Python实现短文本相似度模型并且利用PyQt5封装为工具
Python开发工具系列1------ 基于业务常见情况,利用Python实现短文本相似度模型并且利用PyQt5封装为工具 业务场景介绍 工具介绍 关键功能实现 界面实现 主要业务功能实现 代码与工具 ...
- Java利用反射封装DBUtil,mysql万能增删改查工具类,附源码
Java利用反射封装DBUtil,mysql万能增删改查工具类,附源码 等有时间再慢慢写代码注释吧,先把源码放出来.文章最后有整个项目的压缩包. ps:拓展 Java 原生MySQL JDBC 插入后 ...
- UiPath利用Open browser组件打开IE浏览器时报错Cannot communicate with Internet Explorer browser,而chrome及Firefox却正常
UiPath利用Open browser组件打开IE浏览器时报错,而chrome及Firefox却正常 报错信息如下: Message: Cannot communicate with Interne ...
- Altium Designer利用IPC封装向导创建PCB封装
文章目录 1.Altium Designer利用IPC封装向导创建PCB封装 1.1IPC封装向导 1.Altium Designer利用IPC封装向导创建PCB封装 1.1IPC封装向导 参数参考图 ...
最新文章
- java程序无法连接redis 正常启动但是无法访问
- 财务报销人员是公司亲信的弊端
- 数据库单表千万行 LIKE 搜索优化手记
- Linux的c编程-文件节点的打开与读写操作
- idea maven repositories为空
- Mybatis 缓存
- linux让grep带颜色,在linux下给grep命令添加颜色
- java poodle,Java http客户端和POODLE
- linux下hg命令
- 如何在mac上使用虚拟机中的oracle
- 最常用的小程序demo
- JDBC(powernode CD2206)详尽版(内含教学视频、源代码、SQL文件)
- 树莓派作品2_莫尔斯电码
- CREATE DATABASE failed
- QueryWrapper方法
- 应届生去软通动力怎么样_2020应届生行业薪酬排行榜!薪资高、需求大的岗位有哪些?...
- python操作postgre库,批量进行增删改查和计时比较效率,封装好的普通增删改查和批量增删改查类拿来即用
- Win11的两个实用技巧系列之关闭分屏模式方法
- 用文件的 sha1值判断文件是否重复(delphi语言)
- 【毕业论文】免费查重网站及降重软件