用途:封装只能访问自己的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. 利用属性封装复杂的选项

    1.考虑这样一个场景. 我们的程序中有一个"选项"窗口,这个窗口包含很多选项.其中有一个选项是单选类型的,用户可以从N个选项值中选择一个. 我们需要在用户单击"确定&qu ...

  2. 封装时间转换工具类_利用swig封装C++的dll为C#方便使用

    使用C++开发界面,时间效率上来说,不如C#开发的快和方便.但是CTP的库是C++的,并没有C#的库,网上也有人用C#的PINVOKE的方式将C++的函数一个个转换为C#能用的接口,我是看了下,原理o ...

  3. 利用Vivado封装DCP文件基本流程

    1.1 利用Vivado封装DCP文件基本流程 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)利用Vivado封装DCP文件基本流程: 5)结束语. 1.1.2 本节引 ...

  4. c# string 转 datetime_利用swig封装C++的dll为C#方便使用

    使用C++开发界面,时间效率上来说,不如C#开发的快和方便.但是CTP的库是C++的,并没有C#的库,网上也有人用C#的PINVOKE的方式将C++的函数一个个转换为C#能用的接口,我是看了下,原理o ...

  5. JS 利用promise封装setTimeout So easy

    JS 利用promise封装setTimeout So easy 就是一句代码那么简单 , 实际应用可以结合async / await~ /*** @description:延迟|等待函数* @ret ...

  6. Python开发工具系列1------基于业务常见情况,利用Python实现短文本相似度模型并且利用PyQt5封装为工具

    Python开发工具系列1------ 基于业务常见情况,利用Python实现短文本相似度模型并且利用PyQt5封装为工具 业务场景介绍 工具介绍 关键功能实现 界面实现 主要业务功能实现 代码与工具 ...

  7. Java利用反射封装DBUtil,mysql万能增删改查工具类,附源码

    Java利用反射封装DBUtil,mysql万能增删改查工具类,附源码 等有时间再慢慢写代码注释吧,先把源码放出来.文章最后有整个项目的压缩包. ps:拓展 Java 原生MySQL JDBC 插入后 ...

  8. UiPath利用Open browser组件打开IE浏览器时报错Cannot communicate with Internet Explorer browser,而chrome及Firefox却正常

    UiPath利用Open browser组件打开IE浏览器时报错,而chrome及Firefox却正常 报错信息如下: Message: Cannot communicate with Interne ...

  9. Altium Designer利用IPC封装向导创建PCB封装

    文章目录 1.Altium Designer利用IPC封装向导创建PCB封装 1.1IPC封装向导 1.Altium Designer利用IPC封装向导创建PCB封装 1.1IPC封装向导 参数参考图 ...

最新文章

  1. java程序无法连接redis 正常启动但是无法访问
  2. 财务报销人员是公司亲信的弊端
  3. 数据库单表千万行 LIKE 搜索优化手记
  4. Linux的c编程-文件节点的打开与读写操作
  5. idea maven repositories为空
  6. Mybatis 缓存
  7. linux让grep带颜色,在linux下给grep命令添加颜色
  8. java poodle,Java http客户端和POODLE
  9. linux下hg命令
  10. 如何在mac上使用虚拟机中的oracle
  11. 最常用的小程序demo
  12. JDBC(powernode CD2206)详尽版(内含教学视频、源代码、SQL文件)
  13. 树莓派作品2_莫尔斯电码
  14. CREATE DATABASE failed
  15. QueryWrapper方法
  16. 应届生去软通动力怎么样_2020应届生行业薪酬排行榜!薪资高、需求大的岗位有哪些?...
  17. python操作postgre库,批量进行增删改查和计时比较效率,封装好的普通增删改查和批量增删改查类拿来即用
  18. Win11的两个实用技巧系列之关闭分屏模式方法
  19. 用文件的 sha1值判断文件是否重复(delphi语言)
  20. 【毕业论文】免费查重网站及降重软件

热门文章

  1. PYTHON官方教程:Python3.11中文版文档
  2. 【Unity 3D】常见API的讲解以及在C#脚本中的执行(附源码)
  3. 【面试宝典】2023前端面试题
  4. photoshop插件-开发环境搭建
  5. 2018 年最受欢迎的美国公司 Top 50,亚马逊卫冕!
  6. NOIP模拟赛套路技巧经验总结
  7. RKISP_Driver_User_Manual
  8. 用HTML+CSS做一个漂亮简单的花店网页【免费的学生网页设计成品】
  9. 读《C专家编程》总结(一)
  10. USB转TTL给ESP8266-12F芯片下载程序