今天有个同事问了一下我,怎么在winform里面打开网页啊?我们都是基于B/S的开发,很少接触winform,所以我当时就懵了,实在不知道怎么回答,所以索性说不知道。但是我又想了想,这个应该是个很简单的功能,趁着今天工作不是很忙,我就研究一下吧。

首先,新建一个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();}

  就是如此简单,写更少的代码,做更多的事!

  好了,今天就研究到这吧,不然随着深入,我会越陷越深,工作都顾不上了,就此打住吧。对于HtmlAgilityPack我想以后有时间,我会详细研究它的。

  总结一下:winform这东西,我几百年都没去碰过它,不过既然碰上了,就捣腾一番,写篇文章来记录一下当时我研究了啥,为啥研究,怎么研究,以免以后忘了。对于新事物和新问题,我都是这么去解决的,不知道有没有人和我一样,躺着也中枪?以后还有好多东西要去学习和研究,努力,加油!正能量爆发!!嘎嘎嘎!!!

  工作去……

转载于:https://www.cnblogs.com/yangyy753/archive/2013/01/17/2864892.html

从“在winform里打开网页功能”引发的问题探究相关推荐

  1. c#窗体应用程序链接本地html网页,C#实现Winform中打开网页页面的方法

    本文实例讲述了C#实现Winform中打开网页页面的方法.分享给大家供大家参考.具体实现方法如下: 1.首先比较简单的我们知道有类似的方法如下 System.Diagnostics.Process.S ...

  2. C# winform中打开网页的方法

    [1]linkLabel1_MouseClick private void linkLabel1_MouseClick(object sender, MouseEventArgs e)  //打开网页 ...

  3. 在微信里打开网页,video视频出现问题,video.js插件解决

    在调试的过程中,发现电脑端,手机端在谷歌中打开是没有问题的.但是在微信里打开页面出现问题. 分析:微信自带的内嵌浏览器是X5内核,而谷歌的内核是Webkit,video在X5内核里有兼容性的问题. 通 ...

  4. 微信QQ打开网页时提示用浏览器打开

    需求分析 使用微信或QQ打开网址时,无法在微信或QQ内打开常用下载软件,手机APP等.故此需要在微信qq里提示 功能实现 html实现 <div id='weixin-tip-box'>& ...

  5. qq打开网页时提示用浏览器打开html,微信QQ打开网页时提示用浏览器打开

    微信QQ打开网页时提示用浏览器打开 一,需求分析 1.1,使用微信或QQ打开网址时,无法在微信或QQ内打开常用下载软件,手机APP等.故此需要在微信qq里提示 二,功能实现 2.1 html实现 请点 ...

  6. 小程序能打开html页面,小程序新功能直接打开网页

    原标题:小程序新功能直接打开网页 喜讯小程序终于又开放新功能了,小程序的功能越来越强大了. 我想这个功能不管对对商家还是对开发人员都是非常好的功能,因为可以打开网页代表他可以链接更多,小程序最多可以关 ...

  7. 每次打开百度太麻烦?用程序直接打开网页 Python实现百度划词搜索功能(获取剪切板数据)

    浏览顺序 实现划词功能 运行错误 解决问题 转载声明 实现划词功能 说是划词翻译,实际上我们是通过获取用户的剪切板内容,通过一系列的操作得到的.首先呢,我们就先实现如何获取剪切板内容的程序 首先先在桌 ...

  8. 网页源代码与开发者工具里打开的代码有何区别?在爬取网页是我们该如何进行选择?(网页源代码,框架源代码,开发者工具三者的联系)

    网页源代码与开发者工具里打开的代码有何区别?在爬取网页是我们该如何进行选择? 希望你可以不浪费读我这篇文章的时间,可以从中有所学,有所成长!!!冲冲冲(ง •_•)ง 大家在产生疑惑的地方各有不同,有 ...

  9. Nodejs一键实现微信内打开网页url自动跳转外部浏览器访问的功能

    前言 现如今微信对第三方推广链接的审核是越来越严格了,域名在微信中分享转发经常会被拦截,一旦被拦截用户就只能复制链接手动打开浏览器粘贴才能访问,要不然就是换个域名再推,周而复始.无论是哪一种情况都会面 ...

最新文章

  1. matlab内存管理
  2. tableau和powerbi的联系和区别
  3. 详解struts2中struts.properties
  4. openresty 前端开发入门四之Redis篇
  5. shell基础05 处理用户输入
  6. Linux传递位置参数,Linux-scripts-位置参数等特殊变量
  7. 深入理解 MySQL—锁、事务与并发控制
  8. 2013 Multi-University Training Contest 4 部分解题报告
  9. python docx 表格打印不显示_python-docx 设置 word 文档中表格格式
  10. 中国统计年鉴2021(各省份经济指标,人口规模,工农业数据,主要社会经济指标)
  11. 伴风网易博客linux,伙伴 - 成凹的日志 - 网易博客
  12. 单片机自学需要买开发板嘛?初学者如何使用单片机开发板?
  13. java截取文件名后缀
  14. win8下tomcat配置
  15. Android 键值映射
  16. Dubbo,入门Demo案列使用,框架原理,Zookeeper的使用,安装监控中心和管理控制台,service,provider,comsumer三个项目的Demo
  17. rtklib-单点定位(pntpos.c)代码关键问题解析-satposs部分
  18. 论文推荐:陈国生 实证化中医基础理论
  19. 期末操作系统之HXL所给知识点(速成)
  20. 尽信书不如无书之获取枚举值代码优化

热门文章

  1. 无监督学习才不是“不要你管”
  2. react 使用webpack打包问题汇总
  3. AFNetworking源码学习
  4. Unity3D中的线性插值Lerp()函数解析
  5. Find命令搜索过去一段时间内修改过的文件
  6. 英语面试功略:英语口语突击法
  7. 源代码安装apache遇到的问题解决
  8. android开发我的新浪微博客户端-用户授权页面功能篇(3.2)
  9. 当心异步刷新后的脚本文件加载
  10. 【leetcode】963. Minimum Area Rectangle II