23.1 WebBrowser控件

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

WebBrowser控件类似于IE浏览器的文档界面(事实上IE也是使用的这个控件),它提供了显示网页及支持浏览器的其他文档的容器,同时还提供了浏览器相关的属性、方法和事件,通过它可以很方便地制作一个简易的浏览器,访问并显示网页。

WebBrowser常用属性:

  1. AllowNavigation:加载第一个网页后是否还可以导航到其他页。注意:如果设置为False,那么不管是用Url属性还是Navigate方法或者直接点击网页内的链接,都不能使WebBrowser导航到别的页面。
  2. AllowWebBrowserDrop:是否导航到拖放到它上面的文档。
  3. CanGoBack:指示导航历史记录中的上一页是否可用,如果可用,GoBack方法才能成功。
  4. CanGoForward:指示导航历史记录中的下一页是否可用,如果可用,GoForward方法才能成功。
  5. ContextMenuStrip:关联一个快捷菜单,这是一个ContextMenuStrip类型。
  6. IsWebBrowserContextMenuEnabled:是否启用IE快捷菜单。注意:如果设置了ContextMenuStrip对应的快捷菜单,不论IsWebBrowserContextMenuEnabled设置为True还是False,都会显示自定义的快捷菜单。
  7. Document:表示当前网页,这是一个 HtmlDocument类。它。
  8. DocumentStream:包含网页的内容的流。如果当前未加载网页,则为Nothing。
  9. DocumentText:网页的 HTML 内容。如果当前未加载网页,则为空字符串。
  10. DocumentTitle:文档的标题。
  11. DocumentType:文档的 Multipurpose Internet Mail Extensions (MIME) 类型。
  12. ReadyState:当前状态。
  13. ScriptErrorsSuppressed:是否显示脚本错误消息的对话框。设置为True则不显示对话框,否则显示对话框。
  14. Url:当前文档的URL。
  15. WebBrowserShortcutsEnabled:指示是否启用IE上键盘快捷键。设置为True则启用,否则不启用。
  16. StatusText:包括鼠标指针悬停其上时超链接的URL、当前加载的文档的URL等的状态信息。
  17. ObjectForScripting:网页脚本代码可以用来与应用程序进行通信的对象。

WebBrowser常用方法:

  1. Navigate:将指定的统一资源定位器 (URL) 处的文档加载到 WebBrowser 控件中,替换上一个文档。
  2. GoBack:导航到上一页。
  3. GoForward:导航到下一页。
  4. GoHome:导航到当前用户的主页。
  5. GoSearch:导航到当前用户的默认搜索页。
  6. Print:使用当前打印和页面设置打印当前显示的文档。
  7. ShowPageSetupDialog:打开IE浏览器的页面设置对话框。
  8. ShowPrintDialog:打开IE浏览器的“打印”对话框,但不设置页眉或页脚值。
  9. ShowPrintPreviewDialog:打开IE浏览器的“打印预览”对话框。
  10. ShowPropertiesDialog:打开IE浏览器“属性”对话框。
  11. ShowSaveAsDialog:打开IE浏览器的“保存网页”对话框,如果承载的文档不是HTML页,则打开其“保存”对话框。

WebBrowser常用事件:

  1. DocumentCompleted:当网页或文档载入完成时引发此事件,但是需要注意的是,很多网页有多个页面,会引发多次此事件。
  2. EncryptionLevelChanged:导航到或离开使用了加密的网站时发生。
  3. FileDownload:下载文件时发生。
  4. Navigated:导航到新文档并开始加载该文档时发生。
  5. Navigating:导航到新文档之前发生。它的参数e是一个WebBrowserNavigatingEventArgs类,通过设置e.Cancel=True可以取消对网页的访问。
  6. NewWindow:打开新窗口之前发生。
  7. StatusTextChanged:当StatusText属性值更改时发生。

23.1.1 制作一个简易浏览器

WebBrowser控件提供了NavigateGoHome、GoBack、GoForward等方法,通过这些方法,很容易完成一个简易的浏览器。

【例 23.1【项目:code23-001】简易网页浏览器。

        //打开网址

        private void btnNavigate_Click(object sender, EventArgs e)

        {

            WebBrowser1.Navigate(TextBox1.Text);

            //或者:

            //WebBrowser1.Url = New Uri(TextBox1.Text);

        }

        //后退

        private void btnGoBack_Click(object sender, EventArgs e)

        {

            if (WebBrowser1.CanGoBack)

                WebBrowser1.GoBack();

        }

        //前进

        private void btnGoForward_Click(object sender, EventArgs e)

        {

            if (WebBrowser1.CanGoForward)

                WebBrowser1.GoForward();

        }

        //打印预览

        private void btnPrintPreview_Click(object sender, EventArgs e)

        {

            WebBrowser1.ShowPrintPreviewDialog();

        }

        //网页另存为

        private void btnSaveAs_Click(object sender, EventArgs e)

        {

            WebBrowser1.ShowSaveAsDialog();

        }

        //载入网页完毕

        private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)

        {

            tsslStatus.Text = "载入完毕:" + e.Url.ToString();

        }

        //开始导航

        private void WebBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)

        {

            //阻止访问网址

            if( e.Url.ToString() == "http://www.google.com/" )

            {

                e.Cancel = true;

                tsslStatus.Text = "阻止载入:" + e.Url.ToString();

            }

        }

运行结果如下图所示:

图23-1 使用WebBrowser控件浏览网页

从图23-1可以看出,这个简易浏览器成功地将qq网页打开了。但是,点击页面上的链接,却不能打开相应的网页。造成这个问题的原因是,网页中链接的target属性设置为了_blank,也就是需要在新窗口中打开被链接的页面。

这个问题的解决方法请参看第23.3.3节。

注意:自制浏览器如果不希望使用者调用到类似IE中的右键菜单,应该设置IsWebBrowserContextMenuEnabled属性为false;如果不希望使用IE中的快捷键,应该设置WebBrowserShortcutsEnabled属性为false;如果希望限制用户停留在指定页面,应该设置AllowNavigation属性和AllowWebBrowserDrop属性为false。

23.1.2 获得网页源代码

大多数浏览器都提供了查看网页代码的功能,WebBrowser也提供了DocumentText属性来获得网页代码。

【例 23.2【项目:code23-002】获得网页源代码。

        //显示网页源代码

        private void btnGetSourceCode_Click(object sender, EventArgs e)

        {

            txtSourceCode.Text = WebBrowser1.DocumentText;

        }

运行结果如下图所示:

图23-2 显示网页源代码

一般情况下使用DocumentText即可获得正确结果,但是如果网页的charset设置不是Utf-8的话,获得的代码就会显示为乱码。可见单靠DocumentText是不能正确识别中文网页的。但可以通过DocumentStream属性来获得正确的网页源代码。

修改后的代码如下:

        private void btnGetSourceCode_Click(object sender, EventArgs e)

        {

            MemoryStream ms = new MemoryStream();

            ms = (MemoryStream)WebBrowser1.DocumentStream;

            //注意:使用的编码需要根据网页而定

            StreamReader sr = new StreamReader(ms, System.Text.Encoding.GetEncoding("utf-8"));

            txtSourceCode.Text = sr.ReadToEnd();

            sr.Close();

            ms.Close();

        }

再次运行,显示正确结果:

图23-3 显示网页源代码

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973678.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django-Vue 学习-VUE

主组件中有多个Vue组件 是指在Vue.js框架中,主组件是一个父组件,它包含了多个子组件(Vue组件)。这种组件嵌套的方式可以用于构建复杂的前端应用程序,通过拆分功能和视图,使代码更加模块化、可复用和易于维…

计算机网络安全之一:网络安全概述

1.1 网络安全的内涵 随着计算机和网络技术的迅猛发展和广泛普及,越来越多的企业将经营的各种业务建立在Internet/Intranet环境中。于是,支持E-mail、文件共享、即时消息传送的消息和协作服务器成为当今商业社会中的极重要的IT基础设施。然而&#xff0…

AI学习指南DeepSeek篇(6)-DeepSeek论文介绍

1. DeepSeek LLM: Scaling Open-Source Language Models with Longtermism 发布时间: 2024 年 1 月 5 日 主要内容: 基于 Transformer 架构,采用分组查询注意力(GQA)优化推理成本。 支持多步学习率调度器,提升训练效率。 在预训练和对齐(监督微调与 DPO)方面进行了创新…

刺客信条 枭雄 画质设置以及【锁帧60帧】的办法

刺客信条 枭雄 锁帧60帧的办法 画质设置帧率锁60帧办法 画质设置 关爱老电脑和GPU,适当设置一下画质 我们设置画面的时候,可以看游戏右上角的显存占用,进而观察自己这样设置,GPU的显存够不够: 环境质量:超…

适用于复杂背景的YOLOv8改进:基于DCN的特征提取能力提升研究

文章目录 1. YOLOv8的性能瓶颈与改进需求1.1 YOLOv8的优势与局限性1.2 可变形卷积(DCN)的优势 2. DCN在YOLOv8中的应用2.1 DCN的演变与YOLOv8的结合2.2 将DCN嵌入YOLOv8的结构中2.2.1 DCNv1在YOLOv8中的应用2.2.2 DCNv2与DCNv3的优化 2.3 实验与性能对比…

cesium视频投影

先看效果 使用cesium做视频投影效果,而且还要跟随无人机移动而移动,我现在用定时器更新无人机的坐标来实现效果具体代码如下: 1、CesiumVideo3d.js(某个cesium技术群大佬分享的) // import ECEF from "./CoordinateTranslate"; le…

滚珠花键在使用时需注意什么?

滚珠花键是一种直线运动系统,当花键套利用其中的钢球在经过精密磨削的花键轴上直线运动时,可以传递扭矩。在使用滚珠花键时,需要注意以下几个重要的事项: 1、不要擅自拆卸滚珠花键的各部分,因为这样可能会导致异物进入…

AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践

清华大学出品《DeepSeek:从入门到精通》分享 在忙碌的职场中,制作一份高质量的PPT往往需要投入大量时间和精力,尤其是在临近截止日期时。今天,我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…

PcVue : 点亮马来西亚砂拉越偏远村庄

导读 背景简介 新项目的需求 实施亮点 成果 背景简介 2021年,砂拉越能源公司(Sarawak Energy Berhad)启动了一项意义非凡的项目-借助太阳能、微型水力发电机等可再生能源,为砂拉越州偏远村庄送去光明与动力。然而&#xff0c…

图论 之 迪斯科特拉算法求解最短路径

文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题,分为使用BFS和使用迪斯科特拉算法,这两种算法求解的范围是有区别的 BFS适合求解,边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…

在mfc中使用自定义三维向量类和计算多个三维向量的平均值

先添加一个普通类, Vector3.h, // Vector3.h: interface for the Vector3 class. // //#if !defined(AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_) #define AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_#if _MSC_VER > 1000 #p…

DM执行计划

DM执行计划 1. 引言 理解执行计划对于优化查询性能、诊断慢查询问题至关重要。本文将从基础概念入手,逐步深入探讨执行计划的各个组成部分,并通过设计用例来验证所学知识。 2. SQL 执行计划基础 SQL 执行计划是数据库引擎在执行 SQL 语句时生成的一个…

【鸿蒙开发】第四十三章 Notification Kit(用户通知服务)

目录​​​​​​​ 1 简介 1.1 使用场景 1.2 能力范围 1.3 业务流程 1.4 通知样式 1.5 约束限制 1.6 与相关Kit的关系 2 请求通知授权 2.1 接口说明 2.2 开发步骤 3 管理通知角标 3.1 接口说明 3.2 开发步骤 4 管理通知渠道 4.1 通知渠道类型说明 4.2 接口说明…

SpringBoot:SSL证书部署+SpringBoot实现HTTPS安全访问

一、前言 SSL协议介于TCP/IP协议栈的第四层(传输层)和第七层(应用层)之间,为基于TCP的应用层协议(如HTTP)提供安全连接。它通过在客户端和服务器之间建立一个加密的通道,确保数据在传…

【数学】数论干货(疑似密码学基础)

文章目录 前言一. 整除、算术基本定理、同余、同余类、剩余系的基本定义1.整除2.算数基本定理3.同余4.同余类(也叫剩余类)5.剩余系 二. 费马小定理的内容及其证明1.费马小定理基本内容2.费马小定理的证明(interesting 版) 三. 欧拉…

[实现Rpc] 消息抽象层的具体实现

目录 具象层 _ 消息抽象的实现 信息的抽象类 实现 JsonMessage JsonRequest & JsonResponse 消息-不同消息分装实现 实现 Request RpcRequest TopicRequest ServiceRequest Response RpcResponse TopicResponse ServiceResponse 实现 生产工厂 本篇文章继 …

《A++ 敏捷开发》- 16 评审与结对编程

客户:我们的客户以银行为主,他们很注重质量,所以一直很注重评审。他们对需求评审、代码走查等也很赞同,也能找到缺陷,对提升质量有作用。但他们最困惑的是通过设计评审很难发现缺陷。 我:你听说过敏捷的结对…

PHP房屋出租出售高效预约系统小程序源码

🏠 房屋出租出售高效预约系统 —— 您的智能找房新选择 💡 这是一款集智慧与匠心于一体的房屋出租出售预约系统,它巧妙地融合了ThinkPHP与Uniapp两大先进框架,精心打造而成。无论是小程序、H5网页,还是APP端&#xff…

给老系统做个安全检查——Burp SqlMap扫描注入漏洞

背景 在AI技术突飞猛进的今天,类似Cursor之类的工具已经能写出堪比大部分程序员水平的代码了。然而,在我们的代码世界里,仍然有不少"老骥伏枥"的系统在兢兢业业地发光发热。这些祖传系统的代码可能早已过时,架构可能岌…

Repeated Sequence

记suma[1]a[2]a[3]...a[n]。 该序列以a[1],a[2],a[3]....a[n]为循环节,明显的,问题可转化为:s%sum是否为该序列的某个连续子序列和。 断环为链。将a复制一份。 枚举a[i]为左端点的所有区间的和。再查找s是否存在。二分O&#x…