今天使用CefSharp,加上本地资源文件嵌入了HTML、CSS、JS文件,做为Winform的UI;效果不错,漂亮可控,简简单单,半天时间搞定从开发到上线;

下面记录下相关的备忘:

(窗口的效果)

关闭按钮和最小化按钮,使用JS交互调WIN窗口实现;

重点讲资源文件的嵌入:

1、直接向Resorces文件夹添加文件或文件夹;添加完毕后,每个文件属性需要选择为“嵌入的资源”,才会随程序编译一并打包进程序中;

2、关键的解析:

var ns = ass.GetManifestResourceNames();

通过这个语句,可以在调试中查看到所有资源的路径;

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using CefSharp; namespace mssClient.Helper
{
/// <summary>
/// https://qwqaq.com/ee43a4af.html
/// </summary>
public class ResourceSchemeHandler:CefSharp.ResourceHandler
{
public override bool ProcessRequestAsync(IRequest request, ICallback callback)
{
var names = this.GetType().Assembly.GetManifestResourceNames(); Console.WriteLine(names); Uri u = new Uri(request.Url);
String file = u.Authority + u.AbsolutePath; // 注:目录名需全为小写字母,否则将无法得到 Resource Assembly ass = Assembly.GetExecutingAssembly();
String resourcePath = ass.GetName().Name + ".Resources." + file.Replace("/", "."); // 你可以设置断点看看这里的值
var ns = ass.GetManifestResourceNames();
Task.Run(() =>
{
using (callback)
{
if (ass.GetManifestResourceInfo(resourcePath) != null)
{
Stream stream = ass.GetManifestResourceStream(resourcePath);
string mimeType = "application/octet-stream";
switch (Path.GetExtension(file))
{
case ".html":
mimeType = "text/html";
break;
case ".js":
mimeType = "text/javascript";
break;
case ".css":
mimeType = "text/css";
break;
case ".png":
mimeType = "image/png";
break;
case ".appcache":
break;
case ".manifest":
mimeType = "text/cache-manifest";
break;
}
// Reset the stream position to 0 so the stream can be copied into the underlying unmanaged buffer
stream.Position = 0;
// Populate the response values - No longer need to implement GetResponseHeaders (unless you need to perform a redirect)
ResponseLength = stream.Length;
MimeType = mimeType;
StatusCode = (int)HttpStatusCode.OK;
Stream = stream;
callback.Continue();
}
else
{
callback.Cancel();
}
}
}); return true;
}
}
}

  下面是协议注册类,写在 Program.cs 中,包含协议注册、CEF初始化代码等;

                //CEF
try
{
CefSettings settings = new CefSettings(); //设置浏览器的UA,将用户等信息放到这里,事实上,Winform应该是先启动登录窗口,登录成功后再隐藏登录窗口并显示主窗口。
//settings.UserAgent = "Mss Application Client;"; //设置语言环境为中文环境
settings.Locale = "zh-CN"; //禁用日志输出
settings.LogFile = AppDomain.CurrentDomain.BaseDirectory + "Logs\\chromeWebBrowserDebug.log";
settings.LogSeverity = LogSeverity.Disable; //注册自定义协议,用于读取exe中的资源文件
settings.RegisterScheme(new CefCustomScheme()
{
SchemeName = CustomSchemeHandler.SchemeName,
SchemeHandlerFactory = new CustomSchemeHandler(),
IsCorsEnabled = true,
IsSecure = false
}); //注册自定义协议,用于读取本地程序根目录下的文件
settings.RegisterScheme(new CefCustomScheme()
{
SchemeName = LocalScremeHandler.SchemeName,
SchemeHandlerFactory = new LocalScremeHandler(),
IsCorsEnabled = true,
IsSecure = false
}); //定义缓存目录,不然发布后可能会自动在桌面创建缓存目录
settings.CachePath = App.Instance.ChromeCacheDirectory; //AppDomain.CurrentDomain.BaseDirectory + "ChromeCache\\"; //Initialize cef with the provided settings
Cef.Initialize(settings); //必须做下面的设置,减少白屏的发生,这是CEFSHARP的BUG
if (!settings.MultiThreadedMessageLoop)
{
Application.Idle += (sender, e) => { Cef.DoMessageLoopWork(); };
} //必须使用该语句,在显示页面缩放时,启用高DPI缩放支持,否则页面会出现模糊化。事实上就是强制必须使用100%
Cef.EnableHighDPISupport();
}
catch (Exception ex) { }
//注册主窗口
Application.Run(App.Instance.WebLoginForm);

  

使用WinFrom + CefSharp 开发客户端程序的更多相关文章

  1. 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)

    本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  2. 〖Linux〗Qt+gsoap开发客户端程序,服务端地址设定的字符串转换处理

    之所以写出来,是由于经常因为这个问题屡屡丢面子.. 一般情况下,QString转换成(char*),我们一般直接使用: char *str = qstr->text().toLatin1().d ...

  3. electron vue 开发客户端程序

    文档知识点 https://electronjs.org/docs/tutorial/about (1)Electron通过将Chromium和Node.js合并到同一个运行时环境中,并将其打包为Ma ...

  4. C# 客户端程序调用外部程序的三种实现

    简介 我们用C#来开发客户端程序的时候,总会不可避免的需要调用外部程序或者访问网站,本篇博客介绍了三种调用外部应用的方法,供参考 实现 第一种是利用shell32.dll,实现ShellExecute ...

  5. Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!

    当我们搞定DataSnap后,我们进入客户端程序开发阶段了,我们建立了客户端模块后,打算按照刚才开发服务器的步骤开发客户端程序,随后加入了DBExpress的TSQLDataSet,设定数据库连接后, ...

  6. Linux下用gSOAP开发Web Service服务端和客户端程序

    网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...

  7. WCF开发实战系列五:创建WCF客户端程序

    WCF开发实战系列五:创建WCF客户端程序 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS.Self-Hos ...

  8. Linux下用gSOAP开发Web Service服务端和客户端程序(一)

    1.功能说明: 要开发的Web Service功能非常简单,就是一个add函数,将两个参数相加,返回其和. 2.C版本的程序: (1)头文件:SmsWBS.h,注释部分不可少,url部分的IP必须填写 ...

  9. java websocket开发的客户端程序

    最近用java websocket开发的客户端程序,在和服务端链接通后,在数据传输完毕后,客户端自动关闭了链接,如何能保持链接不断开 这个是客户端的启动类,在循环完毕后,会自动断开和服务器的链接,开始 ...

随机推荐

  1. strcspn函数的用法

    #include <string.h> main() { char *str = "Linux was first developed for 386/486-based pcs ...

  2. 浅入不深出--vuex的简单使用

    什么是vuex,官网的描述是:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.状态管理模式包含3个部分: 1.state,驱动应用的数据源: 2.view,以声明方式将state映射到 ...

  3. 【模板】A*B Problem(FFT快速傅里叶)

    题目:给出两个n位10进制整数x和y,你需要计算x*y.($n \leq 60000$) 分析: 两个正整数的相乘可以视为两个多项式的相乘, 例如 $15 \times 16 = 240$, 可写成 ...

  4. ThinkCMF框架任意内容包含

    更多内容,欢迎关注微信公众号:信Yang安全,期待与您相遇. ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建.ThinkCMF提出灵活的应用 ...

  5. B/S开发——文件夹的上传和下载

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  6. 非旋转 treap

    其实之前学过一次非旋转 treap,但是全忘光了,今天复习一下. 洛谷 P3369 [模板]普通平衡树 code: #include <bits/stdc++.h> #define N 1 ...

  7. Connection to newtaotao failed. [08001] Could not create connection to database

    jdbc.url=jdbc:mysql://localhost:3306/newtaotao?serverTimezone=UTC&characterEncoding=utf-8 数据库是5. ...

  8. 【洛谷】P1032 字串变换

    题目地址:https://www.luogu.org/problemnew/show/P1032 洛谷训练场BFS的训练题呀. “BFS不就是用队列的思想去遍历一切情况嘛.我已经不是小孩子了,我肯定能 ...

  9. iOS9 TableView和ScrollView滚动不响应问题

    今天开始适配iOS9,发现在有UITableView或是ScrollView的界面滚动不灵敏有些卡顿,研究了下是因为tableview的cell里有可以相应点击事件的Button,当我点击到Butto ...

  10. [C++] 对象指针使用方法

    对象指针:指向类对象的指针 类指针指向类变量(对象)的地址 对象指针定义格式: 类类型 *变量名: 举例: #include <iostream> using namespace std; ...