2023年12月1日发(作者:)

C#制作多标签浏览器(一)

Net Framework 提供了WebBrowser控件,作为制作浏览器的基础。

这个控件的常用方法如下:

Navigate(string urlString):浏览urlString表示的网址

Navigate( url):浏览url表示的网址

Navigate(string urlString, string targetFrameName, byte[] postData,

string additionalHeaders):

浏览urlString表示的网址,并发送postData中的消息

(通常我们登录一个网站的时候就会把用户名和密码作为postData发送出去)

GoBack():后退

GoForward():前进

Refresh():刷新

Stop():停止

GoHome():浏览主页

常用属性:

Document:获取当前正在浏览的文档

DocumentTitle:获取当前正在浏览的网页标题

StatusText:获取当前状态栏的文本

Url:获取当前正在浏览的网址的Uri

ReadyState:获取浏览的状态

常用事件:

DocumentTitleChanged,

CanGoBackChanged,

CanGoForwardChanged,

DocumentTitleChanged,

ProgressChanged,

ProgressChanged

这几个意思很明显,就不细说了。

Navigating,开始导航

Navigated,导航完成并开始装载文档

DocumentCompleted按理应该是整个文档装载完成,即网页完全显示完才发生,

但事实上似乎不是,所以还是慎用这个事件。用ReadyState来判断是否完全装

载完成更好。

这些方法、属性、事件,对于实际浏览来说并不够,因为你要能处理弹出新窗口

的信息,就算是你要强制所有的链接都在同一窗口内打开,你也要知道使用者点

了什么链接吧。但是WebBrowser竟然没有提供这个事件,有一个NewWindow

件,在使用者点击链接将要弹出新窗口时发生,但是这个事件没有什么有用的参

数,你根本就不知道使用者要打开的是什么链接。可见WebBrowser的设计者很

不负责。为了解决这个问题,必须借助。工程--添加引用

--COM--Microsoft Internet Controls--确定,就可以把添加到工

程中了,然后我们就可以这样:

//(假设wb是一个已经存在的WebBrowser

te("about:blank");

((owserEvents_Event)XInstance).NewWindow+=Brow

serNewWindow;

DWebBrowserEvents_Event是一个接口,它提供了NewWindow事件,这个事件带

有详细的参数。

BrowserNewWindow就是NewWindow事件的处理程序:

void BrowserNewWindow(string url, int flag, string target, ref object

data,

string header, ref bool processed) {

processed=true;

te(url, null, (byte[])data, header);

}

processed=true的目的是为了防止新窗口在ie中打开。

除了DWebBrowserEvents_Event,还有一个DWebBrowserEvents2_Event接口,

同样可以实现上述功能,区别是后者适用于ie7以上的浏览器,当然前者也可用

ie7,只是不能利用其新特性而已(如在新窗口中打开链接和在新标签中打开

链接是两个不同的事件(NewWindow2,NewWindow3))

上一篇说浏览器核心的制作,这一篇说多标签的实现。

Net Framework 内置的TabControl容器提供了多标签的界面,自动封装了标签

的新建、删除、切换等功能,但是这个控件实在长得难看,所以这里介绍自己制

作标签的方法。

首先是用什么控件来做标签,一开始我用Label,但是Label很难看,所以就改

Button

然后用一个Panel容器来做标签栏,也就是说它是所有标签的父容器。

标签的新建:

Button btn1=new Button();

=150;

=;

(btn1);

这里只设定了宽度,而它的位置、高度都不用设,因为在这里用到了

=,这样标签就始终会停靠在panel2的左侧,标签的

top就是0height就是panel2的高度。如果你想要自定义topheight怎么

办?可以设一下panel2Padding属性,比如设为(0,0,5,5),则标签的top

5,bottom就是panel2的高度-5width就是panel2的高度-10

那么,标签的left是多少?因为每一个标签的Dock都是Left,所以标签会自

动按顺序从左到右排列,如果中途删除了某个标签,它右边的标签就会自动过来

补充,如果插入新的标签,则它会自动挤开右边的标签,这就是Dock属性的好

处。

标签按什么顺序排列?按Zorder,即控件显示的前后顺序,如果两个控件有重

叠区域,则Zorder较高的控件会遮住另一个。通常后添加的控件Zorder较高。

你可以用oFrontBack方法使一个控件处于

Zorder的最前面或最后面。对于Dock在左边的控件,Zorder高的控件在Zorder

低的控件的右边。

每一个标签都会对应一个WebBrowser控件,在新建标签的同时也会新建一个

WebBrowser,我们用一个panel3来显示WebBrowser

WebBrowser wb1=new WebBrowser();

=;

(wb1);

这样wb1自动充满整个panel3

标签的切换:

假设原来激活标签的是btn1,现在点击了btn2,两个标签对应的WebBrowser

wb1wb2,则

(wb2);

(wb1);

就可切换标签。

关键是如何将每个标签与WebBrower绑定,可以使用标签的Tag属性,也可以建

立一个标签数组和WebBrower数组,使其中同位置的元素一一对就,两种方法都

可以。

标签的关闭:

移除标签 (btn1);

然后要从panel3移除标签所代表的WebBrowser,同时关闭标签后还要记得激活

其它的标签。

最后还要调用e();以释放它占用的资源。

在标签上显示网页的标题:

可以在WebBrowserDocumentTitleChanged事件中,用

=((WebBrowser)sender).DocumentTitle;

这一篇讲的是功能的扩展。

假设NewTab(string url)是前面已经完成的在新标签中打开链接的函数。

实现打开主页:

这就要访问注册表,获取ie首页。

string homepage="";

try {

homepage =(string)ue(

"HKEY_CURRENT_USERSOFTWAREMicrosoftInternet ExplorerMain",

"Start Page", "");

}

catch (Exception) {}

NewTab(homepage);

使用try-catch是为了防止读取注册表失败,抛出异常。

实现“粘贴并打开”:

其实就是要获取剪贴板中的文本。

NewTab(t());

恢复关闭的网页:

这就需要在前面所说的关闭标签操作的同时,把即将关闭的标签的url记录起

来。可以用teUri来获取这个url。假设这些关闭过的

url储存在一个名为closed的字符串数组中。

然后就是要在用户点击撤销按钮的时候弹出这个url列表:

ContextMenuStrip menu=new ContextMenuStrip();

for (int i=0; i<; i++)

(closed[i]);

icked+=(o1,e1)=>NewTab();

((Control)sender, on);

(o1,e1)=>NewTab()lambda表达式,代表一个函数,当

menu被点击的时候,就会调用这个函数。

读取打开ie收藏

首先获取ie收藏夹所在路径:

string path=(string)ue(

"HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionExp

lorerShell Folders",

"Favorites", "");

然后获取路径所表示的文件夹对象:

DirectoryInfo dir=new DirectoryInfo(path);

ectories() es()可以获取该目录下的所有子目录

和所有文件,然后对子目录再递归进行以上过程直到遍历所有文件。

ie收藏夹里的网页快捷方式是以".url"后缀存在的,如何从在获取网页的url

文本?那就要知道这种文件的格式。我用记事本打开其中一个,看到是这样的:

[{000214A0-0000-0000-C0046}]

Prop3=19,2

[InternetShortcut]

URL=/fwlink/?linkid=140813

IDList=

所以可见,URL就在[InternetShortcut]的下一行,假设从GetFiles得到一个

FileInfo file1,则可用以下代码得到url

if (ion==".url"){

StreamReader sr=new StreamReader(me);

string url="";

while (!tream) {

string s1=ne();

if (s1=="[InternetShortcut]")

url=ne().Substring(4);

}

}

实现超级拖放

首先要将主窗体的AllowDrop属性设为true

然后为主窗体的DragDropDragEnter事件添加如下事件处理过程:

private void textBox1_DragDrop(object sender, DragEventArgs e) {

NewTab((string)a());

}

private void textBox1_DragEnter(object sender, DragEventArgs e) {

=dEffect;

}

这样的超级拖放有一个特点,就是要将网页元素拖出WebBrowser的范围外,同

时又还在主窗体的范围内,此时释放才有效,至于如何在WebBrowser范围内拖

放就有效,本人还找不到一个很好的方法。

实现自动搜索

传递给NewTab(string url)函数的参数url,有时并不一定是合法的url格式,

我们不妨假定,如果它的格式不正确,则改为用百度

搜索此文本,于是可以这样处理:

try {

Uri uri=new Uri(url);

Visual C# 打造 浏览器

Visual C#是微软推出的新一代程序开发语言,Visual C#实现许多功能是通过调用.Net框架为其中所

.Net程序开发语言提供的一个公用的软件包——.Net FrameWork SDK。在这个软件包中提供了大量

并且十分丰富的类库,可以说,没有这个软件开发包,Visual C#就寸步难行,无法编写哪怕一个功能十

分的程序。但这样也会出现一个问题,如果在.Net FrameWork SDK软件包中没有涉及到的功能,而在

其他的第三方的COM组件中却提供了,那么这些组件是否可以被Visual C#使用。答案是:直接使用是

不可以的,但这些COM组件经过一定转换后就可以。这种转换就是非受管代码(Unmanaged Code

到受管代码Managed Code的转换。因为这些COM组件一般都是非受管代码Unmanaged Code

而编译Visual C#文件时候要使用的类库却只能为受管代码(Managed Code,这就是说要在Visual C

#中使用那些非受管代码组件,就必须把这些非受管代码组件转换成受管代码组件。在.Net框架中专门提

供了一个程序“”来实现由COM组件到WinForm组件的转换。那么这个文件在哪里?假设你

安装.Net FrameWork SDK“C”盘,那么在“C:Program

meworkSDKBin”目录中就可以找到这个文件。如果你安装.Net FrameWork

SDK在其他目录或者磁盘,依照上述的目录顺序就可以找到这个文件了。

下面用Visual C#来做一个浏览器,看看在Visual C#是如何使用COM组件的。

一.本文程序设计和运行的软件环境

1.微软公司视窗2000服务器版

2..Net FrameWork SDK Beta 2

二.程序设计的思路以及关键步骤的解决方法

1.把转换COM组件为WinForm组件:

其实实现这种转换十分的简单,我们知道微软Web浏览器COM组件名称为“”,由于我们使

用的是视窗2000,所以这个文件是存放在“c:winntsystem32”目录中,如果你使用的是视窗98或者

是视窗Me那么此组件存放的位置是“c:windowssystem”“”文件后面有许多的参数,

可以通过“Aximp /?”来了解,在本文中只使用下列简单的命令就可成功转换:

Aximp c:

运行上述命令后就可以实现转换,并在当前目录中产生“”“”二个文件。

具体如下图:

01:转换COM组件为WinForm组件

2.在程序中使用转换后组件:

“”中定义了命名空间“AxSHDocVw”,在此命名空间中定义了一个“AxWebBrowser”

组件,这个组件中有若干个方法和属性,Visual C#就是通过这些方法和属性来实现浏览器的一些基本功

能的。使用此浏览器组件和使用其他的WinForm组件的过程是一样的,首先要导入命名空间,然后在程

序中继承此命名空间中定义的浏览器组件,最后设定这个继承后的组件的属性和方法。具体如下:

< I > .导入命名空间,具体代码如下:

using AxSHDocVw ;

< II> . 继承此命名空间中定义的浏览器组件,具体代码如下:

private AxWebBrowser axWebBrowser1 ;

3.通过转换后组件来实现浏览器的一些基本功能:

浏览器的主要功能就是能够到指定的地址浏览信息,当然在具体的浏览中还有一些基本的功能,譬如:

后退停止刷新主页等,这些功能都可以通过“AxWebBrowser”组件来实现。下面就来

具体介绍:

< I > .浏览指定的地址:

在程序中,网址是填写在组件“textbox1”中的,浏览指定地址功能是通过程序的按钮转到来实现的。

下面是按钮转到按动后的程序代码:

private void button1_Click ( object sender , ntArgs e )

{

nullObject = 0 ;

string str = "" ;

nullObjStr = str ;

Cursor.Current = rsor ;

te ( , ref nullObject , ref nullObjStr , ref nullObjStr , ref

nullObjStr ) ;

Cursor.Current = t ;

}

< II > .浏览器的前进后退停止刷新主页功能:

“AxWebBrowser”组件中对这些功能都有一个具体的方法来与之对应,具体如下面代码:

private void toolBar1_ButtonClick ( object sender , ToolBarButtonClickEventArgs e )

{

//浏览器中的后退

if ( == tb1 )

{

( ) ;

}

//浏览器中的前进

if ( == tb2 )

{

ard ( ) ;

}

//浏览器中的停止

if ( == tb3 )

{

( ) ;

}

//浏览器中的刷新

if ( == tb4 )

{

h ( ) ;

}

//浏览器中的主页

if ( == tb5 )

{

( ) ;

}

}

< III > .当然掌握了上面的知识,你就可以用Visual C#做出一个基本的浏览器了,但下面这些也是不可

缺少的,因为下面这些代码将使得你做的浏览器更专业。下面代码的作用是使得浏览界面随着窗体的变化

而变化,按钮和文本框也要随着窗体的变化而变化。

= ( | ) ;

//定位转到按钮组件与窗体的上、右边框保持一致

= ( ( AnchorStyles.Top | )

| ) ;

//定位地址文本框组件与窗体的上、左、右边框保持一致

= ( ( ( | )

| )

| ) ;

//定位浏览器组件与窗体的上、下、左、右边框保持一致

三.源程序代码(brower.cs

了解有了上面的这些,就可以比较容易编写一个属于自己的浏览器了,下面是用Visual C#做的浏览器源

程序代码,他具备了IE浏览器的一些常用的功能。

using System ;

using g ;

using tions ;

using entModel ;

using ;

using ;

using AxSHDocVw ;

public class Form1 : Form

{

private ToolBar toolBar1 ;

private ToolBarButton tb1 ;

private ToolBarButton tb2 ;

private ToolBarButton tb3 ;

private ToolBarButton tb4 ;

private ToolBarButton tb5 ;

private Label label1 ;

private TextBox textBox1 ;

private Button button1 ;

private AxWebBrowser axWebBrowser1 ;

private ner components = null ;

public Form1 ( )

{

InitializeComponent ( ) ;

}

//清除程序中使用过的资源

protected override void Dispose ( bool disposing )

{

if ( disposing )

{

e ( ) ;

}

}

e ( disposing ) ;

}

//初始化窗体中的各个组件

private void InitializeComponent ( )

{

tb1 = new ToolBarButton ( ) ;

tb2 = new ToolBarButton ( ) ;

tb3 = new ToolBarButton ( ) ;

toolBar1 = new ToolBar ( ) ;

tb4 = new ToolBarButton ( ) ;

tb5 = new ToolBarButton ( ) ;

button1 = new Button ( ) ;

textBox1 = new TextBox ( ) ;

axWebBrowser1 = new AxWebBrowser ( ) ;

label1 = new Label ( ) ;

( ( rtInitialize ) ( rowser1 ) ).BeginInit ( ) ;

dLayout ( ) ;

tb1.Text = "后退" ;

tb2.Text = "前进" ;

tb3.Text = "停止" ;

tb4.Text = "刷新" ;

tb5.Text = "主页" ;

ance = ;

Style = ingle ;

//在工具栏中加入按钮

( tb1 ) ;

( tb2 ) ;

( tb3 ) ;

( tb4 ) ;

( tb5 ) ;

wnArrows = true ;

= "toolBar1" ;

oolTips = true ;

= new ( 612 , 39 ) ;

toolBar1.TabIndex = 0 ;

Result = ;

on = new ( 544 , 45 ) ;

e = "button1" ;

= new ( 40 , 23 ) ;

ex = 3 ;

= "转到" ;

+= new andler ( button1_Click ) ;

//定位地址文本框组件与窗体的上、左、右边框保持一致

= ( ( AnchorStyles.Top | )

| ) ;

on = new ( 64 , 47 ) ;

= "textBox1" ;

= new ( 464 , 21 ) ;

textBox1.TabIndex = 2 ;

textBox1.Text = "" ;

//定位浏览器组件与窗体的上、下、左、右边框保持一致

= ( ( ( | )

| )

| ) ;

d = true ;

on = new ( 0 , 72 ) ;

= new ( 608 , 358 ) ;

axWebBrowser1.TabIndex = 4 ;

on = new ( 16 , 48 ) ;

e = "label1" ;

= new ( 48 , 16 ) ;

ex = 1 ;

= "地址:" ;

aleBaseSize = new ( 6 , 14 ) ;

Size = new ( 612 , 433 ) ;

( axWebBrowser1 ) ;

( button1 ) ;

( textBox1 ) ;

( label1 ) ;

( toolBar1 ) ;

rderStyle = ingle ;

= "Form1" ;

= "visual C#做浏览器" ;

( ( rtInitialize ) ( rowser1 ) ).EndInit ( ) ;

Layout ( false ) ;

}

static void Main ( )

{

( new Form1 ( ) ) ;

}

//实现浏览器主要功能

private void toolBar1_ButtonClick ( object sender , ToolBarButtonClickEventArgs e )

{

//浏览器中的后退

if ( == tb1 )

{

( ) ;

}

//浏览器中的前进

if ( == tb2 )

{

ard ( ) ;

}

//浏览器中的停止

if ( == tb3 )

{

( ) ;

}

//浏览器中的刷新

if ( == tb4 )

Cursor.Current = t ;

}

}

四.编译源程序和编译后的执行程序的运行界面

在经过如下命令编译后,就可以得到可以自己的浏览器了

csc /t:winexe /r: /r: /r:

/r: /r: brower.cs

02:用Visual C#做的浏览器的运行界面

五.总结

至此一个功能相对完备的浏览器就算完成了,其实用Visual C#做浏览器的过程,也就是Visual C

中使用COM组件的过程。掌握了COM组件在Visual C#使用方法,就可以利用Visual C#编写出功能

更强大,适应性更强的软件来,但编写的过程又十分的简单。