最近因为项目的需要,需要研究在C#winform窗体中加载网页,和弹出提醒,但我们的网站是HTML5的,ie浏览器内核不支持,而且因为根据客户机系统的不一致,加载的ie内核可能是不同,显示的效果也会不一致,在网上查询了大量的资料,途中遇到了很多的问题。

因为ie内核不支持html5,所以说得出的结论是webbrowser不能支持html5,但是我们可以用其他的内核。比如火狐的内核Gecko,或webkit内核,我从csdn上下载了版本为22的geckofx:地址:http://download.csdn.net/detail/w297088867/6361867

里面有demo,经过测试,可以运行html5页面,显示的效果与目前最新版的360差不多。这样就可以支持为网页包一层外衣了,可是在后来的发现,当网页中的附件链接,点击无效,无法弹出下载保存对话框,对于这个问题,网上似乎没有给出答案,再加上没有js和C#通信的方法,火狐的内核就被搁置了。

在这之后,我开始寻找关于webkit内核的相关资料,这时候我发现了一个叫open-webkit-sharp的东东,他对webkit进行了再次封装,功能强大,而且博文中说了js和C#互调的办法,虽然也存在无法下载附件的问题,但我想如果js可以调用C#,那么就简单了,我可以自己写个下载链接的方法来弹保存对话框。在绵阳网站建设在进过了很多尝试,也无法让源码在我的机器上跑起来,万般无奈下放弃。

如果是webbrowser的js和C#互调,很简单,可以看看这篇文章:http://www.myk3.com/arc-170.html

后来在博客园看到了一个叫CefGlue的东东,也是对webkit的封装,但是这里博主对于整个浏览器的开发做了比较深刻的描述,并且解决了下载附件弹出保存的问题,于是我采用了这个内核,看了这几篇文章就能满足C#winform对html5的支持了,需要的朋友可以搜索 ‘ 基于.net开发chrome核心浏览器’,目前有7篇文章,其中第四篇有源码下载,比较完善了,解决了附件下载的问题和右键菜单和C#调用js的方法都有。

到这里应该就完了,不过,我们还忽略了一个问题,是js调用C#的方法,这个方法在博文中没有解决,不过小安查过资料,需要看这几篇文章,这几篇文章中的作者通过注册js和C#的反射实现了js调用C#,需要了解的请搜索标题:‘Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告’.

如果你看了是否无法看懂,是有点难以理解,但是没关系,他们提供了一个群号,我当时加入了进去,在群共享有个deme,演示js和C#互调的方法。不过他们这个demo直言是了js和C#的互调,对于文件下载的链接依然无效,需要修改一下文件,点击打开demo工程文件,我们只用到了CefGlue和CefGlue.WindowsForms。打开CefGlue.WindowsForms,新建一个类,取名:BsLifeSpanHandler.cs

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xilium.CefGlue;
 
 
namespace Xilium.CefGlue.WindowsForms
{
    public class BsLifeSpanHandler : CefLifeSpanHandler
    {
        private CefWebClient bClient;
        public BsLifeSpanHandler(CefWebClient bc)
        {
            bClient = bc;
        }
        protected override void OnAfterCreated(Xilium.CefGlue.CefBrowser browser)
        {
            base.OnAfterCreated(browser);
            bClient.Created(browser);
        }
    }
}

然后打开CefWebClient.cs文件,添加声明

1
private readonly CefDownloadHandler downloadHandler;

在构造函数中加入

1
downloadHandler = new BsDownloadHandler();

然后添加一个方法名在文档末尾

1
2
3
4
 protected override CefDownloadHandler GetDownloadHandler()
        {
            return downloadHandler;
        }

这样就可以实现点击文档或附件自动弹出下载对话框了,同时又支持javascript和C#的调用。也就能支持绝大多数的客户端开发了。

效果图来一发如下:

对了,窗体做了自绘处理,这样风格就差不多了。

总结,支持Html5与WinForm客户端结合开发,这样大大的提升了效率,不用去使用winAPI自绘按钮什么的,用网页前段技术就可以做软件了。

源码包有些大,这里就不上传了,在博客园中的第四篇文章中有比较完整的源码下载,二jsC#互调的demo在群里能下载,这里绵阳网站建设就不在累述。好了,文章写到这里就基本上结束了,谢谢你的阅读。

[C#]如何让webbrowser控件支持Html5的更多相关文章

  1. WebBrowser控件支持WebSocket

    修改html页面,在Header标签中添加如下标签: <meta http-equiv="X-UA-Compatible"content="IE=edge" ...

  2. C# 指定Webbrowser控件所用IE内核版本

    如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe,以64位机 ...

  3. WebBrowser控件打开https站点

    背景: 与上一篇博文一样,此文亦是由于开发DropboxAPI中遇到问题衍生出来的.由于需要重定向https类型网站,但自己的https证书是自签名的,总是提示'网站的安全证书存在问题'. 鉴此,查了 ...

  4. C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)控制 WebBrowser 控件的外观和行为

    在 CSDN 上经常看到以下两个问题:1.在 MFC 应用程序中,如果创建了一个 WebBrowser 控件(包括 CHtmlView 在内),如何可以把该控件的三维边框禁止掉?2.在 MFC 应用程 ...

  5. VC++使用WebBrowser控件,强制给控件指定版本显示网页

    转载:http://www.cnblogs.com/1175429393wljblog/p/5398928.html 最近为了抓取淘宝的成交数据,用C#的WebBrowser控件开发了一个简单的程序. ...

  6. PB打开ole控件IE浏览器版本问题_指定Webbrowser控件所用IE内核版本(转)

    如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe 对于32位 ...

  7. Delphi WebBrowser控件的使用(大全 good)

    Delphi WebBrowser控件的使用 WebBrowser控件属性:1.Application      如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDis ...

  8. 强制IE浏览器或WebBrowser控件使用指定版本显示网页

    自从装了IE10之后,就发现好些个网站显示都不是那么的正常,网站上有些功能竟然还会出现一些意想不到的BUG——本来就是针对IE开发的,现在IE下竟然用不起来了,让用户情何以堪?但是就为少量用户使用的系 ...

  9. WPF中不规则窗体与WebBrowser控件的兼容问题解决办法

    原文:WPF中不规则窗体与WebBrowser控件的兼容问题解决办法 引言 这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序. ...

随机推荐

  1. Myeclipse怎么连接MySQL数据库?

    1.打开  >>  Myeclipse 2.Window  >>  Open Perspective  >>  Myeclipse Database Explore ...

  2. MySQL Performance-Schema(三) 实践篇

    前一篇文章我们分析了Performance-Schema中每个表的用途,以及主要字段的含义,比较侧重于理论的介绍.这篇文章我主要从DBA的角度出发,详细介绍如何通过Performance-Schema ...

  3. postgresql 导出数据字典文档

    项目上需要整理目前数据库的数据字典文档.项目不规范,这种文档只要后期来补.这么多张表,每个字段都写到word文档里真心头大.就算前面写了个查询表结构的sql,但是最后整理到word里还是感觉有点麻烦. ...

  4. [已解决]Windows10 系统下HDMI 显示器 没有声音输出的奇怪问题

    今天想用一下显示器自带的喇叭,忽然发现声音输出选项里HDMI的声音设备没了.之前开始使用这台显示器的时是用过一段时间的. 百度了一番,没发现什么线索.后来去谷歌找到这么一段文字: I'm not su ...

  5. centos6 系统安装 system-config-kickstart 工具

    kickstart 能实现 linux 系统的自动化安装,需要设置 ks.cfg 文件,而这个 ks.cfg 文件的生成最好使用 system-config-kickstart 工具生成,比较准确,也 ...

  6. sql select 1-10的数字

    SELECT V FROM (   VALUES (1), (2), (3), (4), (5),          (6), (7), (8), (9), (10) ) [1 to 10](V)

  7. USACO . Friday the Thirteenth

    Friday the Thirteenth Is Friday the 13th really an unusual event? That is, does the 13th of the mont ...

  8. android存储方式的应用场景

    作为一个完整的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.文件存储.SQLite. Content Provider ...

  9. node fs lstat 如何区别文件和文件夹

    通过lstat 得到 文件的描述对象 stat. stat.isFile() stat.isDirectory()

  10. [LeetCode] Arithmetic Slices II - Subsequence 算数切片之二 - 子序列

    A sequence of numbers is called arithmetic if it consists of at least three elements and if the diff ...