首先,新建一个winform项目,我在想,如果想要实现打开网页功能的话,应该会有一个控件什么之类的吧?查了工具栏,真的有一个名叫 WebBrowser的家伙,应该就是这货没错了。在网上查了它的资料更加坚定了我的判断,二话不说,拖进Form里。接着,就是要显示一个网页了,要怎 么实现呢?继续查看WebBrowser都有啥属性和方法:

方法
说明
 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项
 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项
 GoHome 相当于IE的“主页”按钮,连接用户默认的主页
 GoSearch 相当于IE的“搜索”按钮,连接用户默认的搜索页面
 Navigate 连接到指定的URL
 Refresh 刷新当前页面
 Refresh2 同上,只是可以指定刷新级别,所指定的刷新级别的值来自RefreshConstants枚举表, 
该表定义在ExDisp.h中,可以指定的不同值如下: 
REFRESH_NORMAL 执行简单的刷新,不将HTTP pragma: no-cache头发送给服务器 
REFRESH_IFEXPIRED 只有在网页过期后才进行简单的刷新 
REFRESH_CONTINUE 仅作内部使用。在MSDN里写着DO NOT USE! 请勿使用 
REFRESH_COMPLETELY
 将包含pragma: no-cache头的请求发送到服务器
 Stop 相当于IE的“停止”按钮,停止当前页面及其内容的载入
属性
说明
 Application 如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch)。如果在宿主对象中自动化对象无效,这个程序将返回WebBrowser 
控件的自动化对象
 Parent 返回WebBrowser控件的父自动化对象,通常是一个容器,例如是宿主或IE窗口
 Container 返回WebBrowser控件容器的自动化对象。通常该值与Parent属性返回的值相同
 Document 为活动的文档返回自动化对象。如果HTML当前正被显示在WebBrowser中,则 
Document属性提供对DHTML Object Model的访问途径
 TopLevelContainer 返回一个Boolean值,表明IE是否是WebBrowser控件顶层容器,是就返回true
 Type 返回已被WebBrowser控件加载的对象的类型。例如:如果加载.doc文件,就会返 
Microsoft Word Document
 Left 返回或设置WebBrowser控件窗口的内部左边与容器窗口左边的距离
 Top 返回或设置WebBrowser控件窗口的内部左边与容器窗口顶边的距离
 Width 返回或设置WebBrowser窗口的宽度,以像素为单位
 Height 返回或设置WebBrowser窗口的高度,以像素为单位
 LocationName 返回一个字符串,该字符串包含着WebBrowser当前显示的资源的名称,如果资源 
是网页就是网页的标题;如果是文件或文件夹,就是文件或文件夹的名称
 LocationURL 返回WebBrowser当前正在显示的资源的URL
 Busy 返回一个Boolean值,说明WebBrowser当前是否正在加载URL,如果返回true 
就可以使用stop方法来撤销正在执行的访问操作
事件 说明
BeforeNavigate2 导航发生前激发,刷新时不激发
CommandStateChange 当命令的激活状态改变时激发。它表明何时激活或关闭BackForward 
菜单项或按钮
DocumentComplete 当整个文档完成是激发,刷新页面不激发
DownloadBegin 当某项下载操作已经开始后激发,刷新也可激发此事件
DownloadComplete 当某项下载操作已经完成后激发,刷新也可激发此事件
NavigateComplete2 导航完成后激发,刷新时不激发
NewWindow2 在创建新窗口以前激发
OnFullScreen FullScreen属性改变时激发。该事件采用VARIENT_BOOL的一个输 
入参数来指示IE是全屏显示方式(VARIENT_TRUE)还是普通显示方式(VARIENT_FALSE)
OnMenuBar 改变MenuBar的属性时激发,标示参数是VARIENT_BOOL类型的。 
VARIANT_TRUE是可见,VARIANT_ FALSE是隐藏
OnQuit 无论是用户关闭浏览器还是开发者调用Quit方法,当IE退出时就会激发
OnStatusBar OnMenuBar调用方法相同,标示状态栏是否可见。
OnToolBar 调用方法同上,标示工具栏是否可见。
OnVisible 控制窗口的可见或隐藏,也使用一个VARIENT_BOOL类型的参数
StatusTextChange 如果要改变状态栏中的文字,这个事件就会被激发,但它并不理会程序是否有状态栏
TitleChange

Title有效或改变时激发

  看了以上信息后,Navigate这个方法最靠谱,所以在Form1_Load中加入了一句代码:

webBrowser1.Navigate("http://www.baidu.com/");

  运行后百度的页面出来了,搞定!原来如此简单!

  这么一句就搞定了,我开始不满足于现状,我想查看一下生成baidu的网页源代码,有一个属性是:DocumentText,我想应该是这个,于是我在Form1_Load加了这么一句:

  this.textBox1.Text = webBrowser1.DocumentText;

  运行后,发现textbox里啥都没显示,调试发现webBrowser1.DocumentText居然是空值,难道是我 DocumentText不是显示页面内容的属性?不对,我再加入webBrowser1.Document来调试,发现居然是个null值,一定是哪里 弄错了!

  我仔细检查了一下,原来是我看事件不仔细,webBrowser1.DocumentText这个必须放在webBrowser1_DocumentCompleted事件中,等页面加载完成后,才能获取到网页的值,再试一下,果然成功了!

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
  this.textBox1.Text = webBrowser1.DocumentText;
}

  

  不过……为什么会有乱码啊?!

  不行,我要把乱码去掉,默认是utf-8的页面,我只要把它转换成gb2312即可,所以就不能直接webBrowser1.DocumentText,我打算采用StreamReader来转换好一些:

StreamReader getReader = new StreamReader(this.webBrowser1.DocumentStream, Encoding.GetEncoding("gb2312"));
this.textBox1.Text = getReader.ReadToEnd();

  OK,两句就搞定!注意哦,我这里用的是this.webBrowser1.DocumentStream

  我又突发奇想,如果我只想要获取网页中的图片地址该怎么办咧?大概的思路就是从生成的网页源代码里找到img标签,并从src里取出来呗,于是有了以下代码:

       StreamReader getReader = new StreamReader(this.webBrowser1.DocumentStream, Encoding.GetEncoding("gb2312"));
ArrayList list = new ArrayList();
string strRegex = "<img (.|\n)+?>";
Regex regex = new Regex(strRegex, RegexOptions.IgnoreCase);
MatchCollection match = regex.Matches(getReader.ReadToEnd());
int startp, endp;
for (int i = 0; i < match.Count; i++)
{
bool flag = false;
string Img = match[i].ToString();
startp = Img.ToLower().IndexOf("src=\"");
if (startp != -1)
{
startp = startp + 5;
endp = Img.ToLower().IndexOf("\"", startp + 1);
Img = Img.Substring(startp, endp - startp);
foreach (string str in list)
{
if (Img == "str" || Img == "/" || Img == "")
{
flag = true;
break;
}
}
if (!flag)
{
this.textBox1.Text += Img.ToString() + "\r\n";
}
}
}

  输出以下结果:

  http://www.baidu.com/img/shouye_b5486898c692066bd2cbaeda86d74448.gif
  http://www.baidu.com/cache/global/img/gs.gif

  虽然是成功取出了图片地址,但是感觉总是写这么多代码,有点不妥,这样一种取图片的功能,我想应该是很多人都会有这种需求,应该有啥控件或插件之类的吧?再网上搜了一下,果然让我找到了一个比较好用的——HtmlAgilityPack

  把HtmlAgilityPack.dll引入项目后,只要编写如下代码就能实现如上的功能:

            string strImg = "";
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(getReader.ReadToEnd());
     foreach (var img in doc.DocumentNode.SelectNodes("//img"))
{
strImg += img.Attributes["src"].Value.ToString() + "\r\n";
}
       this.textBox1.Text = strImg;

  太强大了,我想HtmlAgilityPack这货的能力应该不仅仅如此,比如还可以用它来去脚本,去样式,和去注释等:

            foreach (var script in doc.DocumentNode.Descendants("script").ToArray())
{
script.Remove();
}
foreach (var style in doc.DocumentNode.Descendants("style").ToArray())
{
style.Remove();
}
foreach (var comment in doc.DocumentNode.SelectNodes("//comment()").ToArray())
{
comment.Remove();
}

  

winform里面打开网页(转)的更多相关文章

  1. 解决 winform打开网页 和WebBrowser打开链接360误报拦截的问题

    以下方法我已经在自己电脑上验证通过,其他电脑并未测试,请广大读者自行验证并反馈,如果有更好的方法请指教. 在winform中如果使用这种方法弹出网页,例如这样 Process.start(" ...

  2. 在WPF程序中打开网页:使用代理服务器并可进行JS交互

    本项目环境:使用VS2010(C#)编写的WPF程序,通过CefSharp在程序的窗体中打开网页.需要能够实现网页后台JS代码中调用的方法,从网页接收数据,并能返回数据给网页.运行程序的电脑不允许上网 ...

  3. 【转】C# winform 加载网页 模拟键盘输入自动接入访问网络

    [转]C# winform 加载网页 模拟键盘输入自动接入访问网络 声明: 本文原创,首发于博客园 http://www.cnblogs.com/EasyInvoice/p/6070563.html  ...

  4. WinForm嵌入Web网页的解决方案

    企业级信息化系统绝大部分采用BS架构实现,如门户网站.OA系统.电商网站等,通过浏览器输入Web网址即可访问,对于使用者来说非常便捷,对于开发维护者来说也非常方便,程序维护只需更新服务器即可,使用者无 ...

  5. Android -- 真正的 高仿微信 打开网页的进度条效果

    (本博客为原创,http://www.cnblogs.com/linguanh/) 目录: 一,为什么说是真正的高仿? 二,为什么要搞缓慢效果? 三,我的实现思路 四,代码,内含注释 五,使用方法与截 ...

  6. 使用urllib2打开网页的三种方法

    #coding:utf-8 import urllib2 import cookielib url="http://www.baidu.com" print '方法 1' resp ...

  7. Apache 打开网页的时候等待时间过长的解决方案

    服务器搭建后经常在打开页面的时候,等待很长时间,有时候,都超过一分钟了,然后才能打开,但是打开后,速度又很快,休息一会再点击,又会很慢了,遇到了这种问题很头疼,由于不是专业做服务器配置的,所以刚开始没 ...

  8. (转)C#调用默认浏览器打开网页的几种方法

    转载,原文地址:http://blog.csdn.net/testcs_dn/article/details/42246969 CSharp调用默认浏览器打开网页的几种方法 示例界面: 方法一:从注册 ...

  9. 用webBrowser打开网页出现脚本错误怎么办

    当IE浏览器遇到脚本错误时,在浏览器左下角会出现一个黄色图标,点击可以查看脚本错误的详细信息,并不会有弹出的错误信息框.我们在用webBrowser编写的程序打开网页,遇到脚本有问题是,会弹出一个错误 ...

随机推荐

  1. luogu 1268 树的重量

    打眼一看就是最小生成树嘛,但经过板子wa掉的经历后得知,,emmmm,原来是, 构造! (虽然不知是什么但觉得听起来很厉害的样子...手动微笑) n=2的情况 自然就是g(1,2) n=3的情况,由于 ...

  2. 【python小练】0004

    第 0004 题:任一个英文的纯文本文件,统计其中的单词出现的个数. 先回忆一下各种括号的用途: () tuple [] list {} dict ([]) set——需要一个list作为输入合集 c ...

  3. pyqt5-是否被编辑

    setWindowModified(bool)     被编辑状态,显示*;    没有被编辑,不显示* isWindowModified()              窗口是否是被编辑状态 from ...

  4. 第28月第10天 iOS动态库

    1. https://www.cnblogs.com/wfwenchao/p/5577789.html https://github.com/wangzz/Demo http://www.kimbs. ...

  5. 转载-MySQL binlog三种模式及设置方法

    原文地址:http://www.cnblogs.com/yangliheng/p/6187327.html 1.1 Row Level  行模式 日志中会记录每一行数据被修改的形式,然后在slave端 ...

  6. Android视频压缩

    最推荐(使用方便,默认压缩为原来视频大小的1/4左右): https://blog.csdn.net/qq_35373333/article/details/79564991  https://git ...

  7. MySql cmd下的学习笔记 —— 有关视图的操作(建立表)

    在查询中,我们经常把查询结果当成临时表 view可以看成是一张虚拟表,是表通过某种运算得到的一个投影 在建立视图时,不需要指定视图的列名与列类型 红框内的为select选择语句 蓝框内的与建表语句类似 ...

  8. MySql cmd下的学习笔记 —— 有关分组的操作(group by)

    (一) 把建立的goods表找到 (二) 当cat_id = 3时,计算所有商品的库存量之和 计算每个cat_id下的库存量(group by) 需要用到分组,把每个红框内的计算在一起 筛选出本店价比 ...

  9. 2.获取公开的漏洞信息-查询还有哪些系统补丁未堵住-查询exp

    本章内容为第一课的实战部分,请结合原创一起浏览. 微软官网 https://www.microsoft.com/zh-cn 在页脚找到TechNet 查看安全公告 MS系列微软编号在微软安全报告中存在 ...

  10. Java基础5-接口

    昨日内容回顾 jvm参数设置 -Xmx //设置最大堆大小 java -Xmx512m Classname -Xms //设置初始堆大小 java -Xms24m Classname -Xss //设 ...